home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / zugabe / icons / objicon / jinnee / jinicons.rsc < prev   
Text File  |  1998-03-20  |  269KB  |  3,438 lines

  1. ; Icon-Zuordnungen für jinnee
  2. ; Erzeugt mit jicons
  3.  
  4. #RSCFILE "JINICONS.RSC"
  5.  
  6. #DESKTOP
  7.  
  8. #ORDNER "A:,B:" "LW FLOPPY"
  9. #ORDNER "C:,D:" "LW HARDDISK"
  10. #LABEL "Sojus" "LW HARDDISK"
  11. #LABEL "Mo*" "LW MOD"
  12. #ORDNER "N:" "LW NETZ"
  13. #ORDNER "O:" "LW CD-ROM"
  14. #LABEL "Ramdisk" "LW RAMDISK"
  15. #ORDNER "U:" "LW SYS-MAGIC"
  16. #ORDNER "clipbrd" "CLIPBOARD"
  17. #DATEI "jinnee.app" "JINNEE APP"
  18. #PAPIERKORB "TRASH"
  19. #NOTIZBLOCK "NOTIZ"
  20.  
  21. #FENSTER
  22.  
  23. #ORDNER ".." "PARENTDIR"
  24. #ORDNER "Acc" "ACC DIR"
  25. #ORDNER "Anwendung,Appls" "AUTOAPP DIR"
  26. #ORDNER "Ausgabe" "AUSGABE DIR"
  27. #ORDNER "Audio,Samples,Ton" "AUDIO DIR"
  28. #ORDNER "*.HSN,*.MOD,*.SMP,*.SND,*.WAV,*.X32" "AUDIO DIR"
  29. #ORDNER "Auto,Bin,Binary" "AUTO DIR"
  30. #ORDNER "Appls,Kernel,Programme,Start,Stop" "AUTOAPP DIR"
  31. #ORDNER "Makro,Makros" "BATCH DIR"
  32. #ORDNER "*.BAT,*.EB2,*.MAC,*.MUP,*.SCL,*.SCR,*.T" "BATCH DIR"
  33. #ORDNER "Bilder,Grafik,Images,Pics" "BILD-BTM DIR"
  34. #ORDNER "*.BLD,*.BMP,*.GIF,*.IFF,*.IMG,*.JPG,*.PCX,*.PIC,*.TIF" "BILD-BTM DIR"
  35. #ORDNER "Ps" "BILD-VEK DIR"
  36. #ORDNER "*.AI,*.CDV,*.CVG,*.CWG,*.EPS,*.GEM,*.PS,*.STL" "BILD-VEK DIR"
  37. #ORDNER "TABCALC,RECHNEN" "CALC DIR"
  38. #ORDNER "*.CSV,*.DIF,*.LDW,*.SGE,*.TXL,*.WKS,*.WK1,*.XLS" "CALC DIR"
  39. #ORDNER "Backup,Copy" "COPY DIR"
  40. #ORDNER "Cpx" "CPX DIR"
  41. #ORDNER "DATA,DATEN,DATENBANK,LAGER,PAY_DATA" "DATEN DIR"
  42. #ORDNER "*.DAT,*.DIR,*.FLS,*.FMR,*.LIB,*.TDB" "DATEN DIR"
  43. #ORDNER "DEV,TREIBER" "DEVICE DIR"
  44. #ORDNER "*.CTL,*.NUM" "DFÜ DIR"
  45. #ORDNER "EMULATION" "EMULATOR DIR"
  46. #ORDNER "EXPORT" "EXPORT DIR"
  47. #ORDNER "FONTS,FONT" "FONT-BTM DIR"
  48. #ORDNER "GDOS-FONTS,METAFONT-FONTS" "FONT-BTM DIR"
  49. #ORDNER "SIGNUM2-FONTS,SIGNUM3-FONTS,TWORD-FONTS" "FONT-BTM DIR"
  50. #ORDNER "*.E24,*.PK,*.S01,*.TMF,*.TWF" "FONT-BTM DIR"
  51. #ORDNER "BTFONTS,HIDE" "FONT-VEK DIR"
  52. #ORDNER "BGI-FONTS,CALAMUS-FONTS,GHOSTVIEW-FONTS" "FONT-VEK DIR"
  53. #ORDNER "SPEEDO-FONTS,TRUETYPE-FONTS,TYPE1-FONTS" "FONT-VEK DIR"
  54. #ORDNER "*.BGI,*.CFN,*.GSF,*.MF,*.PFB,*.SPD,*.T1F,*.TTF" "FONT-VEK DIR"
  55. #ORDNER "SAVEGAME,SPIELE" "GAME DIR"
  56. #ORDNER "GEMSYS,SYSTEM" "GEMSYS DIR"
  57. #ORDNER "CACHE,DISK,DISKETTE" "HD DIR"
  58. #ORDNER "HILFE" "HILFE DIR"
  59. #ORDNER "IMPORT" "IMPORT DIR"
  60. #ORDNER "CNF,DEFAULTS,ETC,INFOS,KONFIG,OPTIONS,SETUP,USER" "INFO DIR"
  61. #ORDNER "*.CNF,*.INF,*.JTP,*.SET,*.TFM" "INFO DIR"
  62. #ORDNER "LOGFILE" "LOG DIR"
  63. #ORDNER "*.LOG" "LOG DIR"
  64. #ORDNER "MAGIC" "MAGX DIR"
  65. #ORDNER "BAUSTEIN,DRIVERS,GVWLOAD,GVWMODUL,GVWPRINT,GVWSAVE,FILTER" "MODUL DIR"
  66. #ORDNER "LIBRARY,MODUL,MODULE,MODULES,XTENSION" "MODUL DIR"
  67. #ORDNER "*.FLT,*.MID,*.TBS" "MODUL DIR"
  68. #ORDNER "LAN,NETZ,TCP/IP" "NETZ DIR"
  69. #ORDNER "ARCHIV,PACKER" "PACKER DIR"
  70. #ORDNER "PATCH" "PATCH DIR"
  71. #ORDNER "*.O" "PROG-BIN DIR"
  72. #ORDNER "ENTWICKLUNG,INCLUDE" "PROG-PLN DIR"
  73. #ORDNER "*.BAS,*.C,*.E,*.F,*.H,*.RIE,*.RIG,*.RIP,*.S,*.STG,*.TEX" "PROG-PLN DIR"
  74. #ORDNER "*.PC,*.PRJ,*.QPJ,*.TPR" "PROG-PRJ DIR"
  75. #ORDNER "ICON,ICONS,RSC" "RSC DIR"
  76. #ORDNER "*.ICO,*.RSC" "RSC DIR"
  77. #ORDNER "CLIPBRD,ALBUM" "SCRAP DIR"
  78. #ORDNER "SERVER" "SERVER DIR"
  79. #ORDNER "DIVERSE,SONSTIG,SONSTIGE,SONSTIGES" "SONSTIGE DIR"
  80. #ORDNER "TEMP,TMP,TEMPDIR" "TEMP DIR"
  81. #ORDNER "*.PCO" "TEXT-BIN DIR"
  82. #ORDNER "DOKUMENT,HTML" "TEXT-EXT DIR"
  83. #ORDNER "*.DOK,*.HTM,*.HTML,*.SDK,*.SDO,*.TW,*.TWD" "TEXT-EXT DIR"
  84. #ORDNER "AIP,CAT1,CAT1M,CAT5,DTP-FAQ.ABB" "TEXT-HLP DIR"
  85. #ORDNER "HELP,HILFE,MAN,MAUSINFO" "TEXT-HLP DIR"
  86. #ORDNER "*.GIH,*.HLP,*.HYP,*.MAN" "TEXT-HLP DIR"
  87. #ORDNER "DEMODOCS,DOC,DOCS,DOKU,DOKUS,MANUAL,TEXT,TEXTE" "TEXT-PLN DIR"
  88. #ORDNER "*.TEX,*.TXT" "TEXT-PLN DIR"
  89. #ORDNER "TRASHDIR,-TRASH-" "TRASH DIR"
  90. #ORDNER "EXTRAS,TOOLS,UTILS,ZUSATZ" "WERKZEUG DIR"
  91. #ORDNER "DATABASE*,DATENBANK*" "DATEN DIR"
  92. #ORDNER "*" "FOLDER"
  93. #DATEI "*.HSN,*.MOD,*.SMP,*.SND,*.WAV,*.X32" "AUDIO"
  94. #DATEI "*.BAT,*.BTP,*.EB2,*.GRP,*.MAC,*.Mup,*.SBT,*.SCL,*.SCR,*.T,*.WCM" "BATCH"
  95. #DATEI "*.BLD,*.BMP,*.GIF,*.IFF,*.IMG,*.JPG" "BILD-BTM"
  96. #DATEI "*.PCX,*.PIC,*.PICT,*.PNM,*.PPM,*.TIF,*.TIFF" "BILD-BTM"
  97. #DATEI "*.AI,*.CDV,*.CVG,*.CWG,*.EPS,*.GEM,*.PS,*.STL" "BILD-VEK"
  98. #DATEI "*.CSV,*.DIF,*.LDW,*.SGE,*.TXL,*.WKS,*.WK1,*.XLS" "CALC"
  99. #DATEI "*.CAT,*.DAT,*.DIR,*.FLS,*.FMR,*.KAT,*.LIB,*.TDB,*.PAY" "DATEN"
  100. #DATEI "*.CTL,*.NUM" "DFÜ"
  101. #DATEI "*.E24,*.FNT,*.PK,*.TWF,*.F9N,*.F30,*.F36,*.L30,*.P9,*.P24,*.S01" "FONT-BTM"
  102. #DATEI "*.CHR,*.CFN,*.GSF,*.MF,*.PFB,*.SPD,*.T1F,*.TTF" "FONT-VEK"
  103. #DATEI "*.SYS" "GEMSYS"
  104. #DATEI "FONTMAP,MFSETUP,TEXSETUP,SPDCHAR.MAP" "INFO"
  105. #DATEI "*.CFG,*.CNF,*.DEF,*.FIF,*.INF,*.INI,*.INX,*.IXA,*.JTP,*.KFG" "INFO"
  106. #DATEI "*.OPL,*.OPT,*.SET,*.TFM,*.QED" "INFO"
  107. #DATEI "*.RC" "INFO BAT"
  108. #DATEI "*.HIS,*.HST,*.LOG" "LOG"
  109. #DATEI "MAG!X.RAM" "MAGX"
  110. #DATEI "*.DEV,*.GVL,*.GVP,*.GVR,*.GVS,*.LMD,*.MID,*.OVL,*.TBS,*.XFS" "MODUL"
  111. #DATEI "*.ARC,*.ARJ,*.DFY,*.GZ,*.HDT,*.HQX,*.LHA,*.LZH,*.LZS,*.MSA" "PACKER"
  112. #DATEI "*.PAX,*.SEA,*.SIT,*.UU?,*.ZIP,*.ZOO" "PACKER"
  113. #DATEI "*.O" "PROG-BIN"
  114. #DATEI "*.BAS,*.C,*.E,*.F,*.H,*.RIE,*.RIG,*.RIP,*.S,*.STG,*.TEX" "PROG-PLN"
  115. #DATEI "*.PC,*.PRJ,*.QPJ,*.TPR" "PROG-PRJ"
  116. #DATEI "ICON,ICONS" "RSC"
  117. #DATEI "*.AM,*.ICO,*.RSC" "RSC"
  118. #DATEI "*.PCO" "TEXT-BIN"
  119. #DATEI "*.DOK,*.DVI,*.HTM,*.HTML,*.PDF,*.SDK,*.SDO,*.TW,*.TWD,*.TWS" "TEXT-EXT"
  120. #DATEI "*.1,*.1M,*.5,*.BUB,*.GIH,*.HLP,*.HYP" "TEXT-HLP"
  121. #DATEI "BUGS,CHANGES,COPYING,COPYRIGH.T,DVI_INFO,ERROR.DAT" "TEXT-PLN"
  122. #DATEI "FUTURE,GEHEIM,HISTORY,INFO" "TEXT-PLN"
  123. #DATEI "LEEME,LEESMIJ,LIESDAS,LISEZMOI,MANIFEST,MANUAL,NEWS" "TEXT-PLN"
  124. #DATEI "WARNUNG.!!!,WICHTIG" "TEXT-PLN"
  125. #DATEI "*.ANL,*.ASC,*.BSP,*.CHG,*.DOC,*.ENG,*.FAQ,*.GER" "TEXT-PLN"
  126. #DATEI "*.LST,*.MAN,*.TER,*.TXT,*.U,*.UPL" "TEXT-PLN"
  127. #DATEI "LIESMICH*,READ_ME*,README*,*READ.ME,SUPPORT*,TEXT*" "TEXT-PLN"
  128. #DATEI "*.TOS" "TOS"
  129. #DATEI "*.APP,*.PRG" "APP"
  130. #DATEI "*.APX,*.PRX" "PRX"
  131. #DATEI "*.ACC" "ACC"
  132. #DATEI "*,ACX" "ACX"
  133. #DATEI "*.CPX" "CPX"
  134. #DATEI "*.CPZ" "CPZ"
  135. #DATEI "*" "FILE"
  136.  
  137. #MINI
  138.  
  139. #ORDNER ".." "PARENTDIR"
  140. #ORDNER "Acc" "ACC DIR"
  141. #ORDNER "Anwendung,Appls" "AUTOAPP DIR"
  142. #ORDNER "Ausgabe" "AUSGABE DIR"
  143. #ORDNER "Audio,Samples,Ton" "AUDIO DIR"
  144. #ORDNER "Auto,Bin,Binary" "AUTO DIR"
  145. #ORDNER "Appls,Kernel,Programme,Start,Stop" "AUTOAPP DIR"
  146. #ORDNER "Makro,Makros" "BATCH DIR"
  147. #ORDNER "Bilder,Grafik,Images,Pics" "BILD-BTM DIR"
  148. #ORDNER "Ps" "BILD-VEK DIR"
  149. #ORDNER "TABCALC,RECHNEN" "CALC DIR"
  150. #ORDNER "Backup,Copy" "COPY DIR"
  151. #ORDNER "Cpx" "CPX DIR"
  152. #ORDNER "DATA,DATEN,DATENBANK,LAGER,PAY_DATA" "DATEN DIR"
  153. #ORDNER "DEV,TREIBER" "DEVICE DIR"
  154. #ORDNER "EMULATION" "EMULATOR DIR"
  155. #ORDNER "EXPORT" "EXPORT DIR"
  156. #ORDNER "FONTS,FONT" "FONT-BTM DIR"
  157. #ORDNER "GDOS-FONTS,METAFONT-FONTS" "FONT-BTM DIR"
  158. #ORDNER "SIGNUM2-FONTS,SIGNUM3-FONTS,TWORD-FONTS" "FONT-BTM DIR"
  159. #ORDNER "BTFONTS,HIDE" "FONT-VEK DIR"
  160. #ORDNER "BGI-FONTS,CALAMUS-FONTS,GHOSTVIEW-FONTS" "FONT-VEK DIR"
  161. #ORDNER "SPEEDO-FONTS,TRUETYPE-FONTS,TYPE1-FONTS" "FONT-VEK DIR"
  162. #ORDNER "SAVEGAME,SPIELE" "GAME DIR"
  163. #ORDNER "GEMSYS,SYSTEM" "GEMSYS DIR"
  164. #ORDNER "CACHE,DISK,DISKETTE" "HD DIR"
  165. #ORDNER "HILFE" "HILFE DIR"
  166. #ORDNER "IMPORT" "IMPORT DIR"
  167. #ORDNER "CNF,DEFAULTS,ETC,INFOS,KONFIG,OPTIONS,SETUP,USER" "INFO DIR"
  168. #ORDNER "LOGFILE" "LOG DIR"
  169. #ORDNER "MAGIC" "MAGX DIR"
  170. #ORDNER "BAUSTEIN,DRIVERS,GVWLOAD,GVWMODUL,GVWPRINT,GVWSAVE,FILTER" "MODUL DIR"
  171. #ORDNER "LIBRARY,MODUL,MODULE,MODULES,XTENSION" "MODUL DIR"
  172. #ORDNER "LAN,NETZ,TCP/IP" "NETZ DIR"
  173. #ORDNER "ARCHIV,PACKER" "PACKER DIR"
  174. #ORDNER "PATCH" "PATCH DIR"
  175. #ORDNER "ENTWICKLUNG,INCLUDE" "PROG-PLN DIR"
  176. #ORDNER "ICON,ICONS,RSC" "RSC DIR"
  177. #ORDNER "CLIPBRD,ALBUM" "SCRAP DIR"
  178. #ORDNER "SERVER" "SERVER DIR"
  179. #ORDNER "DIVERSE,SONSTIG,SONSTIGE,SONSTIGES" "SONSTIGE DIR"
  180. #ORDNER "TEMP,TMP,TEMPDIR" "TEMP DIR"
  181. #ORDNER "DOKUMENT,HTML" "TEXT-EXT DIR"
  182. #ORDNER "AIP,CAT1,CAT1M,CAT5,DTP-FAQ.ABB" "TEXT-HLP DIR"
  183. #ORDNER "HELP,HILFE,MAN,MAUSINFO" "TEXT-HLP DIR"
  184. #ORDNER "DEMODOCS,DOC,DOCS,DOKU,DOKUS,MANUAL,TEXT,TEXTE" "TEXT-PLN DIR"
  185. #ORDNER "TRASHDIR,-TRASH-" "TRASH DIR"
  186. #ORDNER "EXTRAS,TOOLS,UTILS,ZUSATZ" "WERKZEUG DIR"
  187. #OFFEN "Acc" "ACC DIO"
  188. #OFFEN "Anwendung,Appls" "AUTOAPP DIO"
  189. #OFFEN "Ausgabe" "AUSGABE DIO"
  190. #OFFEN "Audio,Samples,Ton" "AUDIO DIO"
  191. #ORDNER "*.HSN,*.MOD,*.SMP,*.SND,*.WAV,*.X32" "AUDIO DIR"
  192. #OFFEN "*.HSN,*.MOD,*.SMP,*.SND,*.WAV,*.X32" "AUDIO DIO"
  193. #OFFEN "Auto,Bin,Binary" "AUTO DIO"
  194. #OFFEN "Appls,Kernel,Programme,Start,Spopp" "AUTOAPP DIO"
  195. #OFFEN "Makro,Makros" "BATCH DIO"
  196. #ORDNER "*.BAT,*.EB2,*.MAC,*.MUP,*.SCL,*.SCR,*.T" "BATCH DIR"
  197. #OFFEN "*.BAT,*.EB2,*.MAC,*.MUP,*.SCL,*.SCR,*.T" "BATCH DIO"
  198. #OFFEN "Bilder,Grafik,Images,Pics" "BILD-BTM DIO"
  199. #ORDNER "*.BLD,*.BMP,*.GIF,*.IFF,*.IMG,*.JPG,*.PCX,*.PIC,*.TIF" "BILD-BTM DIR"
  200. #OFFEN "*.BLD,*.BMP,*.GIF,*.IFF,*.IMG,*.JPG,*.PCX,*.PIC,*.TIF" "BILD-BTM DIO"
  201. #OFFEN "Ps" "BILD-VEK DIO"
  202. #ORDNER "*.AI,*.CDV,*.CVG,*.CWG,*.EPS,*.GEM,*.PS,*.STL" "BILD-VEK DIR"
  203. #OFFEN "*.AI,*.CDV,*.CVG,*.CWG,*.EPS,*.GEM,*.PS,*.STL" "BILD-VEK DIO"
  204. #OFFEN "TABCLAC,RECHNEN" "CALC DIO"
  205. #ORDNER "*.CSV,*.DIF,*.LDW,*.SGE,*.TXL,*.WKS,*.WK1,*.XLS" "CALC DIR"
  206. #OFFEN "*.CSV,*.DIF,*.LDW,*.SGE,*.TXL,*.WKS,*.WK1,*.XLS" "CALC DIO"
  207. #OFFEN "Backup,Copy" "COPY DIO"
  208. #OFFEN "Cpx" "CPX DIO"
  209. #OFFEN "DATA,DATEN,DATENBANK,LAGER,PAY_DATA" "DATEN DIO"
  210. #ORDNER "*.DAT,*.DIR,*.FLS,*.FMR,*.LIB,*.TDB" "DATEN DIR"
  211. #OFFEN "*.DAT,*.DIR,*.FLS,*.FMR,*.LIB,*.TDB" "DATEN DIO"
  212. #OFFEN "DEV,TREIBER" "DEVICE DIO"
  213. #ORDNER "*.CTL,*.NUM" "DFÜ DIR"
  214. #OFFEN "*.CTL,*.NUM" "DFÜ DIO"
  215. #OFFEN "EMULATION" "EMULATOR DIO"
  216. #OFFEN "EXPORT" "EXPORT DIO"
  217. #OFFEN "FONTS,FONT" "FONT-BTM DIO"
  218. #OFFEN "GDOS-FONTS,METAFONT-FONTS" "FONT-BTM DIO"
  219. #OFFEN "SIGNUM2-FONTS,SIGNUM3-FONTS,TWORD-FONTS" "FONT-BTM DIO"
  220. #ORDNER "*.E24,*.PK,*.S01,*.TMF,*.TWF" "FONT-BTM DIR"
  221. #OFFEN "*.E24,*.PK,*.S01,*.TMF,*.TWF" "FONT-BTM DIO"
  222. #OFFEN "BTFONTS,HIDE" "FONT-VEK DIO"
  223. #OFFEN "BGI-FONTS,CALAMUS-FONTS,GHOSTVIEW-FONTS" "FONT-VEK DIO"
  224. #OFFEN "SPEEDO-FONTS,TRUETYPE-FONTS,TYPE1-FONTS" "FONT-VEK DIO"
  225. #ORDNER "*.BGI,*.CFN,*.GSF,*.MF,*.PFB,*.SPD,*.T1F,*.TTF" "FONT-VEK DIR"
  226. #OFFEN "*.BGI,*.CFN,*.GSF,*.MF,*.PFB,*.SPD,*.T1F,*.TTF" "FONT-VEK DIO"
  227. #OFFEN "SAVEGAME,SPIELE" "GAME DIO"
  228. #OFFEN "GEMSYS,SYSTEM" "GEMSYS DIO"
  229. #OFFEN "CACHE,DISK,DISKETTE" "HD DIO"
  230. #OFFEN "HILFE" "HILFE DIO"
  231. #OFFEN "IMPORT" "IMPORT DIO"
  232. #OFFEN "CNF,DEFAULTS,ETC,INFOS,KONFIG,OPTIONS,SETUP,USER" "INFO DIO"
  233. #ORDNER "*.CNF,*.INF,*.JTP,*.SET,*.TFM" "INFO DIR"
  234. #OFFEN "*.CNF,*.INF,*.JTP,*.SET,*.TFM" "INFO DIO"
  235. #OFFEN "LOGFILE" "LOG DIO"
  236. #ORDNER "*.LOG" "LOG DIR"
  237. #OFFEN "*.LOG" "LOG DIO"
  238. #OFFEN "MAGIC" "MAGX DIO"
  239. #OFFEN "BAUSTEIN,DRIVERS,GVWLOAD,GVWMODUL,GVWPRINT,GVWSAVE,FILTER" "MODUL DIO"
  240. #OFFEN "LIBRARY,MODUL,MODULE,MODULES,XTENSION" "MODUL DIO"
  241. #ORDNER "*.FLT,*.MID,*.TBS" "MODUL DIR"
  242. #OFFEN "*.FLT,*.MID,*.TBS" "MODUL DIO"
  243. #OFFEN "LAN,NETZ,TCP/IP" "NETZ DIO"
  244. #OFFEN "ARCHIV,PACKER" "PACKER DIO"
  245. #ORDNER "*.PAL" "PALETTE DIR"
  246. #OFFEN "*.PAL" "PALETTE DIO"
  247. #OFFEN "ARCHIV,PACKER" "PATCH DIO"
  248. #ORDNER "*.O" "PROG-BIN DIR"
  249. #OFFEN "*.O" "PROG-BIN DIO"
  250. #OFFEN "ENTWICKLUNG,INCLUDE" "PROG-PLN DIO"
  251. #ORDNER "*.BAS,*.C,*.E,*.F,*.H,*.RIE,*.RIG,*.RIP,*.S,*.STG,*.TEX" "PROG-PLN DIR"
  252. #OFFEN "*.BAS,*.C,*.E,*.F,*.H,*.RIE,*.RIG,*.RIP,*.S,*.STG,*.TEX" "PROG-PLN DIO"
  253. #ORDNER "*.PC,*.PRJ,*.QPJ,*.TPR" "PROG-PRJ DIR"
  254. #OFFEN "*.PC,*.PRJ,*.QPJ,*.TPR" "PROG-PRJ DIO"
  255. #OFFEN "ICON,ICONS,RSC" "RSC DIO"
  256. #ORDNER "*.ICO,*.RSC" "RSC DIR"
  257. #OFFEN "*.ICO,*.RSC" "RSC DIO"
  258. #OFFEN "CLIPBRD,ALBUM" "SCRAP DIO"
  259. #OFFEN "SERVER" "SERVER DIO"
  260. #OFFEN "DIVERSE,SONSTIG,SONSTIGE,SONSTIGES" "SONSTIGE DIO"
  261. #OFFEN "TEMP,TMP,TEMPDIR" "TEMP DIO"
  262. #ORDNER "*.PCO" "TEXT-BIN DIR"
  263. #OFFEN "*.PCO" "TEXT-BIN DIO"
  264. #OFFEN "DOKUMENT,HTML" "TEXT-EXT DIO"
  265. #ORDNER "*.DOK,*.HTM,*.HTML,*.SDK,*.SDO,*.TW,*.TWD" "TEXT-EXT DIR"
  266. #OFFEN "*.DOK,*.HTM,*.HTML,*.SDK,*.SDO,*.TW,*.TWD" "TEXT-EXT DIO"
  267. #OFFEN "AIP,CAT1,CAT1M,CAT5,DTP-FAQ.ABB" "TEXT-HLP DIO"
  268. #OFFEN "HELP,HILFE,MAN,MAUSINFO" "TEXT-HLP DIO"
  269. #ORDNER "*.GIH,*.HLP,*.HYP,*.MAN" "TEXT-HLP DIR"
  270. #OFFEN "*.GIH,*.HLP,*.HYP,*.MAN" "TEXT-HLP DIO"
  271. #OFFEN "DEMODOCS,DOC,DOCS,DOKU,DOKUS,MANUAL,TEXT,TEXTE" "TEXT-PLN DIO"
  272. #ORDNER "*.TEX,*.TXT" "TEXT-PLN DIR"
  273. #OFFEN "*.TEX,*.TXT" "TEXT-PLN DIO"
  274. #OFFEN "TRASHDIR,-TRASH-" "TRASH DIO"
  275. #OFFEN "EXTRAS,TOOLS,UTILS,ZUSATZ" "WERKZEUG DIO"
  276. #ORDNER "DATABASE*,DATENBANK*" "DATEN DIR"
  277. #OFFEN "DATABASE*,DATENBANK*" "DATEN DIO"
  278. #ORDNER "*" "FOLDER"
  279. #OFFEN "*" "FOLDER OPEN"
  280. #DATEI "FONTMAP,MFSETUP,TEXSETUP,SPDCHAR.MAP" "INFO"
  281. #DATEI "MAG!X.RAM" "MAGX"
  282. #DATEI "ICON,ICONS" "RSC"
  283. #DATEI "BUGS,CHANGES,COPYING,COPYRIGH.T,DVI_INFO,ERROR.DAT" "TEXT-PLN"
  284. #DATEI "FUTURE,GEHEIM,HISTORY,INFO" "TEXT-PLN"
  285. #DATEI "LEEME,LEESMIJ,LIESDAS,LISEZMOI,MANIFEST,MANUAL,NEWS" "TEXT-PLN"
  286. #DATEI "WARNUNG.!!!,WICHTIG" "TEXT-PLN"
  287. #DATEI "*.HSN,*.MOD,*.SMP,*.SND,*.WAV,*.X32" "AUDIO"
  288. #DATEI "*.BAT,*.BTP,*.EB2,*.GRP,*.MAC,*.Mup,*.SBT,*.SCL,*.SCR,*.T,*.WCM" "BATCH"
  289. #DATEI "*.BLD,*.BMP,*.GIF,*.IFF,*.IMG,*.JPG" "BILD-BTM"
  290. #DATEI "*.PCX,*.PIC,*.PICT,*.PNM,*.PPM,*.TIF,*.TIFF" "BILD-BTM"
  291. #DATEI "*.AI,*.CDV,*.CVG,*.CWG,*.EPS,*.GEM,*.PS,*.STL" "BILD-VEK"
  292. #DATEI "*.CSV,*.DIF,*.LDW,*.SGE,*.TXL,*.WKS,*.WK1,*.XLS" "CALC"
  293. #DATEI "*.CAT,*.DAT,*.DIR,*.FLS,*.FMR,*.KAT,*.LIB,*.TDB,*.PAY" "DATEN"
  294. #DATEI "*.CTL,*.NUM" "DFÜ"
  295. #DATEI "*.E24,*.FNT,*.PK,*.TWF,*.F9N,*.F30,*.F36,*.L30,*.P9,*.P24,*.S01" "FONT-BTM"
  296. #DATEI "*.CHR,*.CFN,*.GSF,*.MF,*.PFB,*.SPD,*.T1F,*.TTF" "FONT-VEK"
  297. #DATEI "*.SYS" "GEMSYS"
  298. #DATEI "*.CFG,*.CNF,*.DEF,*.FIF,*.INF,*.INI,*.INX,*.IXA,*.JTP,*.KFG" "INFO"
  299. #DATEI "*.OPL,*.OPT,*.SET,*.TFM,*.QED" "INFO"
  300. #DATEI "*.RC" "INFO BAT"
  301. #DATEI "*.HIS,*.HST,*.LOG" "CALC"
  302. #DATEI "*.DEV,*.GVL,*.GVP,*.GVR,*.GVS,*.LMD,*.MID,*.OVL,*.TBS,*.XFS" "MODUL"
  303. #DATEI "*.ARC,*.ARJ,*.DFY,*.GZ,*.HDT,*.HQX,*.LHA,*.LZH,*.LZS,*.MSA" "PACKER"
  304. #DATEI "*.PAX,*.SEA,*.SIT,*.UU?,*.ZIP,*.ZOO" "PACKER"
  305. #DATEI "*.PAL" "PALETTE"
  306. #DATEI "*.O" "PROG-BIN"
  307. #DATEI "*.BAS,*.C,*.E,*.F,*.H,*.RIE,*.RIG,*.RIP,*.S,*.STG,*.TEX" "PROG-PLN"
  308. #DATEI "*.PC,*.PRJ,*.QPJ,*.TPR" "PROG-PRJ"
  309. #DATEI "*.AM,*.ICO,*.RSC" "RSC"
  310. #DATEI "*.PCO" "TEXT-BIN"
  311. #DATEI "*.DOK,*.DVI,*.HTM,*.HTML,*.PDF,*.SDK,*.SDO,*.TW,*.TWD,*.TWS" "TEXT-EXT"
  312. #DATEI "*.1,*.1M,*.5,*.BUB,*.GIH,*.HLP,*.HYP" "TEXT-HLP"
  313. #DATEI "*.ANL,*.ASC,*.BSP,*.CHG,*.DOC,*.ENG,*.FAQ,*.GER" "TEXT-PLN"
  314. #DATEI "*.LST,*.MAN,*.TER,*.TXT,*.U,*.UPL" "TEXT-PLN"
  315. #DATEI "LIESMICH*,READ_ME*,README*,*READ.ME,SUPPORT*,TEXT*" "TEXT-PLN"
  316. #DATEI "*.TOS" "TOS"
  317. #DATEI "*.APP,*.PRG" "APP"
  318. #DATEI "*.APX,*.PRX" "PRX"
  319. #DATEI "*.ACC" "ACC"
  320. #DATEI "*.ACX" "ACX"
  321. #DATEI "*.CPX" "CPX"
  322. #DATEI "*.CPZ" "CPZ"
  323. #DATEI "*" "FILE"
  324. ◆``, >>>> PURE-C <<<<  for ATARI-ST    Version  1.0  (C)88-90 Borland International  &H ♪f✓&o⇦p⇧`⇩B@#י3ij" k עδ④עδסⁿ⇧#ז( ♪סêij<ⁿ.@Jy"gΣ/✓/♪?<?<JNAO∩  ɶⁿij<ⁿ"@(I$k,ə+Ç<=.<VGRA,O"ט*JJəg:Jəfⁿ®ßfΦ¶⑤fΣ´<f∧B-¯ⁿB⌐¯ⁿ*IBâ"טJəfⁿ"טRâJ②f⌠,IBí`j,IBíAδÇ6<⇧②⓪HüC≡⓪⇧B①Bº`6 ①!j⓪B①J)⇧g✓Hi⇧RC`  ①"fə②¶SI ①"Wח¯°SAkHi⇧RCB①SëQח¯הJ)⇧g╱Hi⇧RCHy`*ON¨✓8M∈⇧#מ$0⇨ M"LN¨◆h? 9⑦Øg⇦ @NÉ 9⑦Àg⇦ @NÉN¨④ ?<LNAHτ8(HE∙əΩC∙⑧x JN¨✓äG∩⓪/♪"L JN¨✓אXOp⇧N¨⇧ªL∞NuA∙⑧êa¯®NuHτ⑧08&H&⇧$I J"⇨0⇦N¨⑦j(Jäk╱Àäg⇩x⌡Jäj⓪?⇦/♪A∙⑧ùa¯å\OL∞ ⑧NuHτ⑧08&H&⇧$I J"⇨0⇦N¨⑦B(Jäk╱Àäg⇩x÷Jäj⓪?⇦/♪A∙⑧†a¯H\OL∞ ⑧NuHτ⓪0&I&$P╱ÉB@`╱B2R@ã|m⌠"K JN¨①✓⑤|¯ñ✓%C
  325. L∞ ✓NuHτ⓪<O∩¯ס6&H*I(oHE∩$"Jr⇦ K0⇨a¯*⇩Ư¯BB2⇨pN¨⑦T Æ⇨f⓪Bö"MrH K0⇨a¯⇩`p(¶$ Æ⇧c⑥ ②r⓪Γ¿?/♪A∙⑧αa³ÿ\OCתr$ K0⇨a³סA∙⑦´Cת/I,/M(`*0(✓g⇦p$`⇩p"⓪"o,t41⑧סé"(⇦"o(#Ç⑧AΦ
  326.  ⓪jפO∩0L∞<✓NuHτ>O∩¯á/H\/IXB@ o\N¨⑦î&JCj②?⇨//^A∙⑨⇧a³\OK∩⇦HoL"M o`0⇨a³⌠XOM∩Pp\ o\N¨⓪∮,ê ⑥g╱ VRH`⇦ o\/HTp. oTN¨⓪∮,ê ⑥g✓(⑥ÿ»T`  oTN¨①N(*-Dםäם¶)p⇧ijàg⇩Rà,❎ץåץ¶8 ╱N¨③B.ê ⑦f⇦a²À$WEΩA≥X,ê(VI∮ M"Jp①"ןQז¯ⁿCΩHrÕפ¡D o\0⇨a²É0⇨N¨⑦| -DC∙⑨% Na²⌠p$ס¡DC∙⑨- Na²Γ.❎`✓Sç VRûB⓪Jçf⌠ -DG≥✓p(ס¡D&ÇB½⇦'m⇦✓'m✓ 'm ⓪'m⓪④'m$⑧'m④'m   -DA⌠✓,ê V ¶❎⇧ V!|❎⇧⇦ V!|❎⇧✓ V!|❎⇧  V!|❎⇧⓪ V!|❎⇧④ V!|❎⇧⑧ V!|❎⇧ V!|❎⇧ Aδ$,ê VXû ¶⇧ ⇦"oT VN¨①x VB0HRäp⇧ijäg╱ VB0H VN¨②d W0¶`ə WB¿⇩ W!E╱ WB¿
  327.  W!|p W!@⑥ W!@② WBhə -⇦G≥✓p ס¡⇦.-(`22+╱א|¯Æ|④g⑧[Ag④UAg⓪)¶❎⇧✓"/LצØ✓Sçס¶⑧Gδ⑧Jçfט.-0 -✓`2"<❎⇧)ü✓✓)ü✓⇦)ü✓"/LצØ✓"/LצØ✓⇦"/LצØ✓✓Sçס¶Jçfט.-4 - `2"<❎⇧)ü✓✓)ü✓⇦)ü✓"/LצØ✓"/LצØ✓⇦"/LצØ✓✓Sçס¶"Jçfט.-8 -⓪`⑧)¶❎⇧✓"/LצØ✓Sçס¶JçfΣ.-< -④`④)¶❎⇧✓"/LצØ✓SçXÇJçfΦ.-@ - `④)¶❎⇧✓"/LצØ✓SçXÇJçfΦ.-, -$`④)¶❎⇧✓"/LצØ✓SçXÇJçfΦB@ oXN¨⑦ß&JCj②?⇨//ZA∙⑨5a·ê\O"W"╱ oX0⇨a·ⁿ0⇨N¨⑦|O∩`L∞|°NuHτ⓪(O∩¯6$HÀ|⇩m╱À|⇨o(?<⑨ö?<öp⇨?p⓪?p⇩?A∙⑨[N¨✓JO∩
  328. p⇧`VÀ|⇩f8"j⇦AתN¨①✓p.AתN¨⓪∮(Hp\AתN¨⓪∮¨זc⇩B④C∙ə<AתN¨⓪ñ` "j✓AתN¨①✓Cת j⇦a√öB@O∩⇧L∞④✓NuA·(p✓"@ ①"êByəTAת1ⁿ⇨·B3ⁿÇəT3ⁿ¯¯əVOס"ÇNu/
  329. Hz¯כ?<&NN\O$_Nu/YOMת,ÅC∩ HzañXOXO,_NuH@B@H@C∙ə®r⇧a❎áJ@k⇩Nu.Vp¯`ץ/QOMת-O⇦,ê IC∩⓪HzadXOPO,_NuH@B@H@"Vr⇧a❎dJ@k⇩Nu.n⇦p¯`∧/QOMת-O⇦,ê I"o⓪Hza&XOPO,_NuH@B@H@"Vr⇧a❎&J@k⇩Nu.n⇦p¯`∧Hτ8]O$H&I(o&BCx%p¯ JR@əəg⇩2´⇦f⌠J@g╱ש@HijNöBE⓪əg⇩>BA②Æ< Ø<⓪b②;⓪✓k⑥è⇧`Γ⇧¯¯⇩¯¯¯¯¯¯¯⇦¯✓¯¯⓪|¯ã<*f⇦<`&②Æ<0Ø<    b AΩ¯¯Cתp
  330. a✓②$W㶯b⇧Σ<⓪əg⇧ץt¯ã<.f6⓪əã<*f⇦4`$É<0ã<    b AΩ¯¯Cתp
  331. a◆ק$W㶯b⇧ª4⓪əg⇧ß②א<∞Ø<Lf ✓ד⓪əg⇧ê`╱ã<hg≥ã⇦gór@É⇧ã⇧d⇧pij|?ס@0;╱N√⇩⇧`⇧`⇧`⇧`⇧`⇧N⇧`⇧N⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`·⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`Éם⇧N⇧N⇧N⇧`ם⇧`⇧`⇧`⇧`Ç⇧⇧⇩⇧`⇧`¿⇧`´⇧`⇧`³⇧`⇧`⇧`⇧`⇧`⇧`⇧` [0â`³|A∩⇦⓪ä`✓0A∩⇦⓪Ç⓪❎2╱"La⇩Nש@`³\ [⓪❎2╱"La⇩Lש@`³JJEj⇦ `⇦p0?⇩②❎4╱ La⇧"TOש@`³*JEj⇦ `⇦0Hij?⇩②❎4╱ LaãTOש@`³
  332. ✓ד❎JEj⇦ `⇦p0?⇩②❎4╱ La≡TOש@`²µJEj⇦ `⇦p0?⇩②❎4╱ La⇧⓪TOש@`²הש@HijNö0⇨\OL∞xNup24<¯¯A· "La⇧áp¯`Γ
  333. Warning: use TCFLTLIB to get float support for printf.
  334. Hτ⑧ O∩¯Φv
  335. JÇj②|-╱?|⇧✓DÇ`¬✓⇧⇩g⓪|+╱?|⇧✓`ö✓⇧g| ╱?|⇧✓`~?|✓`vHτ⑧ O∩¯Φv
  336. ?|✓`dHτ⑧ O∩¯Φv⓪✓⇧⇧f✓?|✓`L|0╱✓⇧❎f|x◆?|⇩✓`2|X◆?|⇩✓`$Hτ⑧ O∩¯Φv✓✓⇧⇧f✓?|✓` |0╱?|⇧✓$H>üבC8⇩j⇩xA∩
  337. a❎∈A∩
  338. p¯J⑧Wז¯ⁿF@?@⑥✓⇨❎gA∩
  339. 2SAk④taœ⑧Sח¯ⁿb
  340. ⇩(∞¯¯Qח¯≡2/✓פ@4/(j⇩t⇧ö@j⇩tפB✓⇨⇦g⓪✓⇨⇨f
  341. 0⇦ÉAo✓פ@ק@ÿAl⇩x?B⇦?D⇩`jHτ⑧0$H&IB(⇧v⇧`②Hτ⑧0$H&Iv¯J⑧Wי¯ⁿFCJBj⇩4⇨œCb⇩6⇩xJAk✓ØCc⇦8⇧ÿC✓⇨f⓪ K0⇦aÄ0⇨ JNô`0⇨ JNô0⇦ Kax0⇨סDL∞ ⑧Nu6⑦x0/⇩g✓⇨⇨f✓ן@ JaV0/✓g✓ן@A∩╱NÆ0/⇦g✓ן@ Ja00/⑥g✓ן@A∩
  342. NÆ0/⇩g✓⇨⇨g✓ן@ Ja⑧0⇦O∩⑧L∞⇦⑧NuHτ⑧0E·6`✓Hτ⑧0E·4&H6g8µKg SC Jp✓NôQי¯° J0⇦ij|◆g⇩NôL∞ ⑧Nu00000000        Hτ⑧:$H&I(S&gfJüg^✓+⇧②g`✓)⇩②ft✓δ╱②,k x$⇨⑧ם¨מd Séf÷RäÕüe∈`.&î/⇧/⇩ Ka~$"J@k,f4(S✓δ╱②SéfכRäÕüfג✓½╱②&î ⇧L∞\⑧Nu3ⁿ⑦ã✓δ❎②p¯`Φ✓δ❎②"⇦`ם&x,A'J✓'J⇦E≥8'J &è✓δ╱② Ka②J@kגfכRäÕÄfש"`ªHτ⓪⑧&H(k✓6+⓪"+⇦Æîg⓪0⇨Düt⇧aכJÇkè✓+◆②fZ"③ÆîSü"L Ip
  343. ã⑨g╱Süj°`*③|¯¯/⇧/    "    Æê0⇨a`"_"JÇkNgPAΘ¯¯p
  344. ⓪ÇSüjכHτ@ij"    Æê0⇨a<L∞⇨⇩JÇk*g,`②0⇨"③Æî La$JÇk⑥g⑧&î'L⇦✓½╱②B@L∞⑧✓Nup¯`÷p⇧`≥Hτ@á??<@NAO∩ $_JÇk╱ãüf⓪NuaÀ3ij⑦ãp¯Nu3ⁿ⑦ãNuHτ⑧ œ|⇩bÉgə?⇩?/⇧?<BNAO∩
  345. JÇkjL∞⇦⑧NuJüoΓ6(⇧?<⇩?⇨p/?<BNAO∩
  346. JÇkDHz¯À <⇦ÕÇe⇦/`⇩/⇦?⇨?<@NAO∩ JÇk ÿ¶⇦bק?<⇧?⇨p/?<BNAO∩
  347. JÇjûa②3ij⑦ãp¯`ê0<⑥`≡D@É| ã|"b╱⓪;✓Nup❎Nu⑥⇩④⑧    ❎ ♪❎❎❎❎❎③❎❎⇩❎❎❎❎❎❎❎❎❎❎❎❎❎❎❎②  ✓J⑧gJ⑧g⑧J⑧g④J⑧g⓪J⑧g J⑧g✓J⑧g⇦J⑧fαSH⓪ךg⓪ךg⑧⓪ךg④⓪ךg⓪⓪ךg ⓪ךg✓⓪ךg⇦⓪ךfα @Nuôח②⑧g
  348. Øf°CΦ¯¯`≥Jg⇦ INuSHNu ✓⓪ךg<⓪ךg8⓪ךg4⓪ךg0⓪ךg,⓪ךg(⓪ךg$⓪ךg ⓪ךg⓪ךg⑧⓪ךg④⓪ךg⓪⓪ךg ⓪ךg✓⓪ךg⇦⓪ךfij @Nu"HJ⑧gJ⑧g⑧J⑧g④J⑧g⓪J⑧g J⑧g✓J⑧g⇦J⑧fα ✓ÉëSÇNu"✓SÇe⓪⓪ךf°B⇩JÇg╱⓪אSÇf· ANuHτ⓪0$Hã|⇧gœã|$b¼G·⇨ÿrt②əgéJ3⓪k⌠SJ②əgtJ@f"p
  349. Ø<0f:p✓②əgb⑥⇧ה<∞À<Xf(p⓪②əf"`Nã|⓪fəØ<0f④②əg>⑥⇧ה<∞À<Xf⇦②əg.G·⇦8②3⓪Ød"④⇧②ə②3⓪Ød⑥&⇩HCהijHCJCfəגijקâקüdΓ`⓪ ⇩&    g⇦SJ"èL∞ ✓Nu3ⁿ"⑦ãp¯`
  350. 3ⁿ!⑦ãp&    gα"ê`ץ"✓C·⇧םB@⓪⓪⓪±f° ANu/⇨/✓ßⁿ"4⇧UBœ|"bZC∩"t¯&HCJCf⑥ÇIJ&HC③;0NRBH@B@H@f∮`$?⇦&8BCHCåIJ0⇨6⇦åIJH@0⇨HC③;0&RBJÇfα8⓪ךQט¯ⁿB⑧∧ⁿ" _&Nu3ⁿ!⑦ã`Ω0123456789abcdefghijklmnopqrstuvwxyzHτ⓪ &/⇨?<HNA\OJÇf④ 9Dg  @ ⇨NÉJ@fαp @L∞⇦✓NuHτ⓪0&g¼PâRâה<³À¶°e  ⇨a¯Ø ✓gÜ!C⇦C∙⑥ æ"êAΦ✓`tG∙ə&S ♪f0 < a¯é ✓gj&@Aδ✓p Ç!|°⇦'H⇦&¨ə#יəAδ⇦"P`  )⇦Éâd
  351.  I"Q     f≡`ãr⓪ãüd⇦ æ`
  352. #@⇦צij#C⇦"¶ö±n◆AΘ✓L∞ ✓Nuk✓ |¯≡`≡æז3ⁿ ⑦ã`Σ/♪&y⑥ ♪g/♪&S?<INA\O`∈&yə ♪g/♪&S?<INA\O`∈&_Nu⇧⇩⇨⇦❎╱◆✓    
  353. ♪ ⓪①②③④⑤⑥⑦⑧⑨ə !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥ßƒáíóúñѪº¿⌐¬½¼¡«»ãõØøœŒÀÃÕ¨´†¶©®™ijIJאבגדהוזחטיכלמנסעפצקרשתןךםףץ§∧∞αβΓπΣσµτΦΘΩδ∮ϕ∈∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²³¯@@@@@@@@@ijijijijij@@@@@@@@@@@@@@@@@@Ç⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧②②②②②②②②②②⇧⇧⇧⇧⇧⇧::::::88888888888888888888⇧⇧⇧⇧⇧⇧66666644444444444444444444⇧⇧⇧⇧@¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯⇧⇩⇨⇦❎╱◆✓    ¯¯¯¯¯¯¯
  354. ♪ ⓪①②③④⑤⑥⑦⑧⑨ə !"#¯¯¯¯¯¯
  355. ♪ ⓪①②③④⑤⑥⑦⑧⑨ə !"#¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯Hτijá>¶@NAO∩ $_NuHR?⇩?⇧/?<BNAO∩
  356. $_NuHτijá>¶?NAO∩ $_NuHR??<>NAXO$_NuHR?HP?<=NAPO$_NuHR?HP?<<NAPO$_Nu⇩⇦⇧⇦✓⇧╱ ⇧✓⓪⇧
  357. ④⇧ ⑧⇧⇧⓪ ⇧②$⇧④(⑥,⑧0ə48< @"D⇧¯¯¯¯¯¯¯¯
  358. ◆rcom: ERROR: out of memory
  359. can't read file %s (error code %d)
  360. can't write file %s (error code %d)
  361. %s: unknown version number (%d)
  362. can't open file %s (error code %d)
  363. _rdesar_numrsccan't create file %s (error code %d)
  364. GEM RESOURCE COMPILER           Release %d   %02x.%02x.%02x
  365. Written by Harald Siegmund      Copyright (c) 1990-%x
  366.  
  367. usage: rcom resource_file [object_file]
  368.  
  369.        default for object_file: resource filename with extension .o
  370. .oənənənə®⇧⇧╱¯¯╱⇩◆⇨╱⇩r╱⑥⓪Σ✓
  371. ✓ ②╱✓⓪
  372. ə$ə6D6⑧`②, ⑧(D
  373. ②ק⇧Ü②<╱ə
  374. ✓(⓪✓@⇧⇧⇧⇧⇧⇧2⇧& ÿ⇧≡ Æ@F⓪0╱R
  375. ⑧⇧⇧⇧⇧⇧⇧<⇦⇦⇦`əəµ⇩÷ ã◆``Ω >>>> PURE-C <<<<  for ATARI-ST    Version  1.0  (C)88-90 Borland International  &H ♪f✓&o⇦p⇧`⇩B@#יץ3ijα k עδ④עδסⁿ⇧#זµ ♪סêij<ⁿ.@JyαgΣ/✓/♪?<?<JNAO∩  ɶⁿij<ⁿ"@(I$k,ə+Ç<=.<VGRA,O"ט*JJəg:Jəfⁿ®ßfΦ¶⑤fΣ´<f∧B-¯ⁿB⌐¯ⁿ*IBâ"טJəfⁿ"טRâJ②f⌠,IBí`j,IBíAδÇ6<⇧②⓪HüC≡⓪⇧B①Bº`6 ①!j⓪B①J)⇧g✓Hi⇧RC`  ①"fə②¶SI ①"Wח¯°SAkHi⇧RCB①SëQח¯הJ)⇧g╱Hi⇧RCHy`*ON¨✓ZM∈⇧#מΓ0⇨ M"LN¨◆Γ? 9əΦg⇦ @NÉ 9ə∮g⇦ @NÉN¨④j?<LNAHτ8(HE∙¿C∙ə≡ JN¨    ⇩G∩⓪/♪"L JN¨    @XOp⇧N¨⇧ªL∞NuA∙⇧a¯®NuHτ⑧08&H&⇧$I J"⇨0⇦N¨əÉ(Jäk╱Àäg⇩x⌡Jäj⓪?⇦/♪A∙⓪a¯å\OL∞ ⑧NuHτ⑧08&H&⇧$I J"⇨0⇦N¨əh(Jäk╱Àäg⇩x÷Jäj⓪?⇦/♪A∙a¯H\OL∞ ⑧NuHτ⑧⑧O∩¯≥8(H&I&⇧B@`╱B7R@ã|m⌠"KAתN¨①"|¯ñ✓/C
  376. Cתr L0⇦a¯äO∩L∞⑧⑧NuHτ⑧8$H(I&&o⑧ ⇨rN¨ə⑥& JN¨①h(`& ⇦"J KN¨①ÆJ@f②p✓ãäg╱⓪3Hf╱ +
  377. `Gδ ⇨SâJÇfפ/ /
  378. A∙Ya³öPOpL∞⑧Nu 9⇩g⑧09╱N¨əó y⇩N¨əגNuHτ>O∩¯À&H?@H(I?|`ə p/@*/@&/@"/|.p/@6/@2Bo:B@ KN¨əק&JCj⓪?⇨/♪A∙{a³⓪\O3ב╱#י⇩A·¯vN¨✓lC∩ r K0⇨a³n0/HHijσêN¨③L/H< /<f⇦a³✓B»@¥מ.ÄBE`⇧םB@2❎HIJσë t⑧N¨əØ,JFj⑧?╱0❎Hijσê/4✓A∙ía²Æ\OC∩⇦r0❎Hijσê t✓0╱a²ij o`ə⇦fə /╱f④ /
  379. g /f✓pã»②g⑥0❎Hijσê/4✓A∙דa²DXO /
  380. ס»②ס¶2❎HIJσë o<!Ç⑧./
  381. ∧ç∧»② ◆N¨③L$H 
  382. f⇦a²D"J"◆0❎Hijσê t✓0╱a²<0╱N¨əó /&g8 /②"/
  383. A≥⑧עij/HDx` oD0⓪g /&עØHTäT»DTäT»DÕ»
  384. e∧ /
  385. A≥✓/HDp N¨③L*H f⇦aⁿכB¡✓//D /⑥2❎HIJσë"t⑧A∙∮a²~XO*Ø✓ ⑤ע»@ ⑤.τÅ∧ÇσÅ ◆N¨③L+H⇦ -⇦f⇦aⁿÇ//D /⑥2❎HIJσë"t⑧A∙⌠a²6XOC≥✓ m⇦ ◆N¨⑤l ⑦f╱,M.Ä`╱-M✓,M"J"/
  386.  K0⇨aⁿ~ JN¨④⑥ /
  387. ע»&RE´oHm³",W`."n⇦ ⑥"τëפÇσë K0⇨aⁿJ*n✓ n⇦N¨④⑥ NN¨④⑥,M fמC∩@r⇦ K0⇨aⁿ "/&C∙ⁿ K0⇨aⁿL"/@ ⇧τêסüσêע»&"/&C∙⇦ K0⇨aⁿ*X»&BE`גB@2❎HIJσë t⑧N¨əØ,JFj⑧?╱0❎Hijσê/4✓A∙ a√0\OC∩⇦r0❎Hijσê t✓0╱a√^BB2╱0❎Hijσê o< 0✓N¨əzJÇj⑥0❎Hijσê/4✓A∙0a·ΦXO /
  388. N¨③L$H 
  389. f⇦a√ "J"/
  390. 0❎Hijσê t✓0╱a√⇩0╱N¨əó"J"/
  391.  K0⇨a√* JN¨④⑥RE´oHm¯8 o<N¨④⑥ /@.τÅ∧ÇσÅXç ◆N¨③L$H/JD 
  392. f⇦a·á"◆B@ JN¨⑦V(◆ΣîSä` oDX»D ¶❎⇧ ⇦SäJÇfΩ"J"◆ K0⇨a·œBB2⇨pN¨əzJÇj/♪A∙Ea·④XOC∩ r K0⇨a·ê0⇨N¨əóB¨⇩O∩JL∞|°Nu?⇨/
  393. 6$HÀ|⇨l"?<öp⇦?p⑨?p⇩?A∙ZN¨✓זPOp⇧`②CΩ✓p³סC j⇦a√FB@$_6NuA·(p✓"@ ①"êBy⓪Aת1ⁿ⇨·B3ⁿÇ⓪3ⁿ¯¯②Oס"ÇNu/
  394. Hz¯כ?<&NN\O$_Nu09④ã| g"C·$#חəΦC∙✓ס@ס@#êRy④pNup¯Nu?⇨/♪69④g⑧0⇨ס@ס@G∙✓שijSC cNÉQי¯·&_6Nu/YOMת,ÅC∩ HzañXOXO,_NuH@B@H@C∙|r⇧a❎áJ@k⇩Nu.Vp¯`ץ/QOMת-O⇦,ê IC∩⓪HzadXOPO,_NuH@B@H@"Vr⇧a❎dJ@k⇩Nu.n⇦p¯`∧/QOMת-O⇦,ê I"o⓪Hza&XOPO,_NuH@B@H@"Vr⇧a❎&J@k⇩Nu.n⇦p¯`∧Hτ8]O$H&I(o&BCx%p¯ JR@əəg⇩2´⇦f⌠J@g╱ש@HijNöBE⓪əg⇩>BA②Æ< Ø<⓪b②;⓪✓k⑥è⇧`Γ⇧¯¯⇩¯¯¯¯¯¯¯⇦¯✓¯¯⓪|¯ã<*f⇦<`&②Æ<0Ø<    b AΩ¯¯Cתp
  395. a◆Ø$W㶯b⇧Σ<⓪əg⇧ץt¯ã<.f6⓪əã<*f⇦4`$É<0ã<    b AΩ¯¯Cתp
  396. a◆t$W㶯b⇧ª4⓪əg⇧ß②א<∞Ø<Lf ✓ד⓪əg⇧ê`╱ã<hg≥ã⇦gór@É⇧ã⇧d⇧pij|?ס@0;╱N√⇩⇧`⇧`⇧`⇧`⇧`⇧N⇧`⇧N⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`·⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`⇧`Éם⇧N⇧N⇧N⇧`ם⇧`⇧`⇧`⇧`Ç⇧⇧⇩⇧`⇧`¿⇧`´⇧`⇧`³⇧`⇧`⇧`⇧`⇧`⇧`⇧` [0â`³|A∩⇦⓪ä`✓0A∩⇦⓪Ç⓪❎2╱"La⇩Nש@`³\ [⓪❎2╱"La⇩Lש@`³JJEj⇦ `⇦p0?⇩②❎4╱ La⇧"TOש@`³*JEj⇦ `⇦0Hij?⇩②❎4╱ LaãTOש@`³
  397. ✓ד❎JEj⇦ `⇦p0?⇩②❎4╱ La≡TOש@`²µJEj⇦ `⇦p0?⇩②❎4╱ La⇧⓪TOש@`²הש@HijNö0⇨\OL∞xNup24<¯¯A· "La⇧áp¯`Γ
  398. Warning: use TCFLTLIB to get float support for printf.
  399. Hτ⑧ O∩¯Φv
  400. JÇj②|-╱?|⇧✓DÇ`¬✓⇧⇩g⓪|+╱?|⇧✓`ö✓⇧g| ╱?|⇧✓`~?|✓`vHτ⑧ O∩¯Φv
  401. ?|✓`dHτ⑧ O∩¯Φv⓪✓⇧⇧f✓?|✓`L|0╱✓⇧❎f|x◆?|⇩✓`2|X◆?|⇩✓`$Hτ⑧ O∩¯Φv✓✓⇧⇧f✓?|✓` |0╱?|⇧✓$H>üבC8⇩j⇩xA∩
  402. a❎zA∩
  403. p¯J⑧Wז¯ⁿF@?@⑥✓⇨❎gA∩
  404. 2SAk④taœ⑧Sח¯ⁿb
  405. ⇩(∞¯¯Qח¯≡2/✓פ@4/(j⇩t⇧ö@j⇩tפB✓⇨⇦g⓪✓⇨⇨f
  406. 0⇦ÉAo✓פ@ק@ÿAl⇩x?B⇦?D⇩`jHτ⑧0$H&IB(⇧v⇧`②Hτ⑧0$H&Iv¯J⑧Wי¯ⁿFCJBj⇩4⇨œCb⇩6⇩xJAk✓ØCc⇦8⇧ÿC✓⇨f⓪ K0⇦aÄ0⇨ JNô`0⇨ JNô0⇦ Kax0⇨סDL∞ ⑧Nu6⑦x0/⇩g✓⇨⇨f✓ן@ JaV0/✓g✓ן@A∩╱NÆ0/⇦g✓ן@ Ja00/⑥g✓ן@A∩
  407. NÆ0/⇩g✓⇨⇨g✓ן@ Ja⑧0⇦O∩⑧L∞⇦⑧NuHτ⑧0E·6`✓Hτ⑧0E·4&H6g8µKg SC Jp✓NôQי¯° J0⇦ij|◆g⇩NôL∞ ⑧Nu00000000        Hτ⑧:$H&I(S&gfJüg^✓+⇧②g`✓)⇩②ft✓δ╱②,k x$⇨⑧ם¨מd Séf÷RäÕüe∈`.&î/⇧/⇩ Ka~$"J@k,f4(S✓δ╱②SéfכRäÕüfג✓½╱②&î ⇧L∞\⑧Nu3ⁿəµ✓δ❎②p¯`Φ✓δ❎②"⇦`ם&x,A'J✓'J⇦E≥8'J &è✓δ╱② Ka②J@kגfכRäÕÄfש"`ªHτ⓪⑧&H(k✓6+⓪"+⇦Æîg⓪0⇨Düt⇧aכJÇkè✓+◆②fZ"③ÆîSü"L Ip
  408. ã⑨g╱Süj°`*③|¯¯/⇧/    "    Æê0⇨a`"_"JÇkNgPAΘ¯¯p
  409. ⓪ÇSüjכHτ@ij"    Æê0⇨a<L∞⇨⇩JÇk*g,`②0⇨"③Æî La$JÇk⑥g⑧&î'L⇦✓½╱②B@L∞⑧✓Nup¯`÷p⇧`≥Hτ@á??<@NAO∩ $_JÇk╱ãüf⓪NuaÀ3ijəµp¯Nu3ⁿəµNuHτ⑧ œ|⇩bÉgə?⇩?/⇧?<BNAO∩
  410. JÇkjL∞⇦⑧NuJüoΓ6(⇧?<⇩?⇨p/?<BNAO∩
  411. JÇkDHz¯À <⇦ÕÇe⇦/`⇩/⇦?⇨?<@NAO∩ JÇk ÿ¶⇦bק?<⇧?⇨p/?<BNAO∩
  412. JÇjûa②3ijəµp¯`ê0<⑥`≡D@É| ã|"b╱⓪;✓Nup❎Nu⑥⇩④⑧    ❎ ♪❎❎❎❎❎③❎❎⇩❎❎❎❎❎❎❎❎❎❎❎❎❎❎❎②  ✓⓪ךg<⓪ךg8⓪ךg4⓪ךg0⓪ךg,⓪ךg(⓪ךg$⓪ךg ⓪ךg⓪ךg⑧⓪ךg④⓪ךg⓪⓪ךg ⓪ךg✓⓪ךg⇦⓪ךfij @Nu"HJ⑧gJ⑧g⑧J⑧g④J⑧g⓪J⑧g J⑧g✓J⑧g⇦J⑧fα ✓ÉëSÇNuSÇe②②⑧g
  413. Ø⑨g⌠b p¯NuJ⑨f°pNup⇧NuHτ⓪0$Hã|⇧gœã|$b¼G·╱Nrt②əgéJ3⓪k⌠SJ②əgtJ@f"p
  414. Ø<0f:p✓②əgb⑥⇧ה<∞À<Xf(p⓪②əf"`Nã|⓪fəØ<0f④②əg>⑥⇧ה<∞À<Xf⇦②əg.G·╱∈②3⓪Ød"④⇧②ə②3⓪Ød⑥&⇩HCהijHCJCfəגijקâקüdΓ`⓪ ⇩&    g⇦SJ"èL∞ ✓Nu3ⁿ"əµp¯`
  415. 3ⁿ!əµp&    gα"ê`ץ/⇨/✓ßⁿ"4⇧UBœ|"bZC∩"t¯&HCJCf⑥ÇIJ&HC③;0NRBH@B@H@f∮`$?⇦&8BCHCåIJ0⇨6⇦åIJH@0⇨HC③;0&RBJÇfα8⓪ךQט¯ⁿB⑧∧ⁿ" _&Nu3ⁿ!əµ`Ω0123456789abcdefghijklmnopqrstuvwxyzHτ⓪ &/⇨?<HNA\OJÇf④ 9êg  @ ⇨NÉJ@fαp @L∞⇦✓NuHτ⓪0&g¼PâRâה<³À¶°e  ⇨a¯Ø ✓gÜ!C⇦C∙ק æ"êAΦ✓`tG∙ן&S ♪f0 < a¯é ✓gj&@Aδ✓p Ç!|°⇦'H⇦&¨ן#יןAδ⇦"P`  )⇦Éâd
  416.  I"Q     f≡`ãr⓪ãüd⇦ æ`
  417. #@⇦צij#C⇦"¶ö±n◆AΘ✓L∞ ✓Nuk✓ |¯≡`≡æז3ⁿ əµ`Σ/
  418.  ✓oBQê Éö±n◆f
  419. axJg*`6C∙ק ①g,ãêg✓"@ ①f÷` "É/✓?<INA\OJÇj⇩`p$_Nuõⁿ¯≡g≥p¯`≡/♪&yק ♪g/♪&S?<INA\O`∈&yן ♪g/♪&S?<INA\O`∈&_NuHτ8$<≡CΦ¯°G∙ן ③gã"    ÆÇØéc
  420. &@ ③f≥`ß(@ ,⇦g④õijb*"✓פ¿⇦ØÇe╱g `é Ç)H⇦`p"@")⇦צ¿⇦ æ)H⇦`>"@ ①g⇦õijb÷"    פ⌐⇦Øêeg⇩`N"(⇦צ⌐⇦`╱"ê Ç"H"    פ⌐⇦ØÇf  @"(⇦צ⌐⇦"É l⇦ ¿°⇦e②b⑧&ö/ ?<INA\OJÇf✓QijL∞NuPij`÷JÇg⇧Σ/✓øזb°g⇧שצijעij2    4✓✓⇧g⓪✓⇩f②①!SÇf·`⇧Õ✓⇩f≡`✓①!SÇg⇧¿"ΩëΦëgûHτ?LΘxⁿ¯ןHα?LΘxⁿ¯ãHα?LΘxⁿ¯êHα?LΘxⁿ¯`Hα?LΘxⁿ¯8Hα?LΘxⁿ¯⓪Hα?LΘxⁿ³ΦHα?LΘxⁿ³ijHα?LΘxⁿ³ÿHα?LΘxⁿ³pHα?LΘxⁿ³HHα?LΘxⁿ³ Hα?LΘ⑧ⁿ³Hα?⑧Æⁿ⇩Süf¯vL∞xⁿ2ij|⇧¯ΣHg✓S@!!Qז¯ⁿא|⇨g≡SA①!Qח¯ⁿ`Σ2    4✓✓⇧g⓪✓⇩f②⓪ךSÇf·`ט✓⇩f≡`⇦⓪ךSÇ"ΩëΦëgöHτ?LךxⁿHסxⁿLךxⁿHΦxⁿ(LךxⁿHΦxⁿPLךxⁿHΦxⁿxLךxⁿHΦxⁿáLךxⁿHΦxⁿזLךxⁿHΦxⁿ≡LךxⁿHΦxⁿ⇧⑧LךxⁿHΦxⁿ⇧@LךxⁿHΦxⁿ⇧hLךxⁿHΦxⁿ⇧ÉLךxⁿHΦxⁿ⇧ÕLך⑧ⁿHΦ⑧ⁿ⇧αסⁿ⇩Süf¯xL∞xⁿ2ij|⇧¯ΣHg✓S@ ךQז¯ⁿא|⇨g✓SA⓪ךQח¯ⁿ _Nu/✓עIJ$✓✓⇩g✓Süe¼①4④0⇩HB4 ⇧αêΣêgxHτ_>"⇩&⇩(⇩*⇩,⇩.⇩"B$B&B(B*B,BHα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα~Hα`SÇf¼L∞|·א|⇨¯0⇧ΣHg✓S@!⇩Qז¯ⁿא|⇨g✓SA①⇩Qח¯ⁿ _Nu@@@@@@@@@ijijijijij@@@@@@@@@@@@@@@@@@Ç⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧⇧②②②②②②②②②②⇧⇧⇧⇧⇧⇧::::::88888888888888888888⇧⇧⇧⇧⇧⇧66666644444444444444444444⇧⇧⇧⇧@¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯⇧⇩⇨⇦❎╱◆✓    ¯¯¯¯¯¯¯
  421. ♪ ⓪①②③④⑤⑥⑦⑧⑨ə !"#¯¯¯¯¯¯
  422. ♪ ⓪①②③④⑤⑥⑦⑧⑨ə !"#¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯$⇧HBJBf($HBJBf
  423. ÇIJH@B@H@NuB@H@HBÇIJ0@0⇩ÇIJH@0✓H@Nu AH@r2B@tסÇצüÆêd⇩פêעÇצüQט¯⌠F@NuHτijá>¶@NAO∩ $_NuHR?⇩?⇧/?<BNAO∩
  424. $_NuHτijá>¶?NAO∩ $_NuHR??<>NAXO$_NuHR?HP?<=NAPO$_NuHRHP?<ANA\O$_NuHR?HP?<<NAPO$_Nu
  425. ◆rlink: ERROR: out of memory
  426. can't read file %s (error code %d)
  427. can't write file %s (error code %d)
  428. undefined symbol '%s' in file %s
  429. can't create file %s (error code %d)
  430. can't open file %s (error code %d)
  431. file %s is no valid compiled resource
  432. _numrsc_rdesar_rdesar_numrsccan't open file %s (error code %d)
  433. file %s: seek error
  434. file %s: seek error
  435. GEM RESOURCE LINKER             Release %d   %02x.%02x.%02x
  436. Written by Harald Siegmund      Copyright (c) 1994
  437.  
  438. usage: rlink target_file compiled_resource[...]
  439. ,,,|⇧⇧╱¯¯╱⇩◆⇨╱⇩r╱⑥⓪Σ✓
  440. ✓ ②╱✓⓪
  441. ə$ə68
  442. ⓪,④✓╱╱╱F⓪ ╱
  443. .⑧N4&R&"&⑥&:✓"$⑧4④⓪(⑥④⑥ə6 ╱.╱0⓪✓⓪╱②:⇧⇧⇧⇧⇧⇧2⇧& ÿ⇧É ~@F⓪0╱R"<⑧*⇧⇧⇧⇧⇧⇧⇧⇧v⇦⇦⇦
  444. /*
  445. *
  446. *  Demonstration for Handling of compiled resources
  447. *
  448. *  Link this file in two ways:
  449. *
  450. *  - without DEMRSC.O and RSRC.O: the resource will be loaded from disk
  451. *  - with DEMRSC.O and RSRC.O: the resource is included in the program file
  452. *
  453. *  You won't have to change anything in the source code!
  454. *
  455. */
  456.  
  457.  
  458. #include <aes.h>
  459. #include "demorsc.h"
  460.  
  461.  
  462.  
  463. int main()
  464. {
  465.  
  466.    int      x,y,w,h;                /* pos and size of demo form */
  467.    OBJECT   *pmenu,                 /* ^ to menu bar tree */
  468.             *pform;                 /* ^ to form tree */
  469.  
  470.  
  471.    appl_init();                     /* init AES */
  472.  
  473.    rsrc_load("demorsc.rsc");        /* load the resource */
  474.    rsrc_gaddr(R_TREE,MENU,&pmenu);  /* get ^ to menu bar */
  475.    rsrc_gaddr(R_TREE,FORM,&pform);  /* and ^ to form */
  476.    menu_bar(pmenu,1);               /* show menu bar */
  477.    form_center(pform,&x,&y,&w,&h);  /* center form */
  478.  
  479.                                     /* lock redraw area */
  480.    form_dial(FMD_START,0,0,0,0,x,y,w,h);
  481.                                     /* draw form */
  482.    objc_draw(pform,ROOT,MAX_DEPTH,x,y,w,h);
  483.    evnt_keybd();                    /* wait for any key */
  484.                                     /* force redraw of form background */
  485.    form_dial(FMD_FINISH,0,0,0,0,x,y,w,h);
  486.  
  487.    menu_bar(pmenu,0);               /* hide menu bar */
  488.    rsrc_free();                     /* remove resource */
  489.    appl_exit();                     /* exit AES */
  490.  
  491.    return 0;
  492. }
  493.  
  494. ⇩⇩MENU⇧⇨FORM#define MENU 0      /* TREE */
  495. #define FORM 1      /* TREE */
  496. ə⇨D⇩ק⇩Ø⇩ñ$⌠╱,⇩⇦⇧⇧╱4 Desk  File   Your message here --------------------123456  Quit       Lots of objects ...STRINGBUTTONTEXTBOXTEXT______EDIT:______XXXXXX______EDIT:______XXXXXXPRESS ANY KEY TO EXIT¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯³¯¯¯¯≡¯¯¯¯≡¯¯¯¯≡¯¯¯¯≡¯¯¯¯≡¯¯¯¯≡¯¯¯¯≡¯¯¯¯≡¯¯¯³ij╱ij¯åijijåIJ@åבijåאåאåאåאåאåאåאåאåאåב¯¯ç≡ 0 ∙∙ê0 ✓ü    H0 ✓ü    (0 ∙∙⑧0 0¯¯¯¯≡◆¯¯¯¯Ç ij⑧?≡?≡`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧°`⑧`⑧?≡?≡` ij◆¯¯¯¯Ç?0וçÅα 9כככ 6נכÇ 0כלכ?0כונα⇩④╱⑧⇧⌠⇧ä§⓪0⑧⑧0✓ÿ¥ß⇨╱①ǯ¯❎⇧ƒº¿⇨╱⇩①ǯ¯✓⇧⌐ã¶⇨╱①ǯ¯◆ בטש⇨╱⇩①ǯ¯◆ ¯¯⇧❎⑨Z⑨❎⇩⇩④①Z⇩⇧⇧⇨⇦⑨⇩ ⇨⇧⇦¯¯¯¯ $╱⇨⇧⇩¯¯¯¯ +╱╱⇨⇧╱⑨⇨⇧P③◆④¯①⇩④✓✓¯¯¯¯2④⇧    ¯¯¯¯✓G⇧④⇧
  497. ¯¯¯¯\⇩④⇧♪¯¯¯¯^⇨④⇧ ¯¯¯¯`⇦④⇧¯¯¯¯b❎④⇧¯¯¯¯d╱④⇧╱¯¯¯¯f◆④⇧❎⓪⓪④¯①✓⇧¯¯¯¯ h⇧¯¯⇧④ ⇧①7⇩¯¯¯¯v⇩⇧③⇧⇨¯¯¯¯è╱⇨╱⇧⇦¯¯¯¯ə⇧æ⑤⇨✓⇧❎¯¯¯¯⑤⇩ק╱⇦⇦⇧╱¯¯¯¯⑥⇩≡⑤⇦✓⇧◆¯¯¯¯✓⇨ ╱❎♪⇧✓¯¯¯¯✓⇨(⑤❎♪⇧    ¯¯¯¯⇩Ø&⇧╱⇨
  498. ¯¯¯¯⑦ ⇩ñ&❎╱⇨♪♪④¯①❎✓╱
  499. ⑨⇧①⇩⇧    ⇦♪¯¯¯¯C¯①⇩⇧❎⇩¯¯¯¯ə!∧⑨
  500. ə⇦⇨D⇦ץ/*******************************************************************************
  501. *
  502. *  Project name : GENERAL C LIBRARY FOR TOS APPLICATIONS
  503. *  Module name  : Library for compiled resources
  504. *                 Release 2
  505. *  Symbol prefix: rsrc
  506. *
  507. *  Author       : Harald Siegmund (HS)
  508. *  Co-Authors   : -
  509. *  Write access : HS
  510. *
  511. *  Notes        : This library has to be used with:
  512. *
  513. *                 Resource Compiler (RCOM) Release 2
  514. *                 Resource Linker (RLINK) Release 1
  515. *
  516. *                 Mixing new and old versions of RCOM and RSRC.C will lead to
  517. *                 an 'undefined symbol' error during linking.
  518. *
  519. *-------------------------------------------------------------------------------
  520. *  Things to do : -
  521. *
  522. *-------------------------------------------------------------------------------
  523. *  History:
  524. *
  525. *  1990:
  526. *     Apr 05: introduced, implementation
  527. *     Jul 23: fast object coordinate fix function
  528. *     Oct 09: bug fixed: tree index overflow checking didn't work
  529. *             changing initialization (no longer use pointers which
  530. *              don't appear in the relocation table)
  531. *  1991:
  532. *     Jun 08: cosmetic changes
  533. *  1992:
  534. *     May 22: reorganize source
  535. *             adding rsrc_saddr() and rsrc_obfix()
  536. *     Jun 05/23: cosmetic changes
  537. *  1993:
  538. *     Apr 26: new file header
  539. *     Aug 30: replace RHDR _RSCHDR by LONGHDR _RSCLHDR (long header format)
  540. *  1994:
  541. *     Mar 01: adding RSCDES concept and rsrc_select() function
  542. *     Mar 10: cosmetic changes
  543. *     Mar 16: allow wildcards in rsrc_select()
  544. *     Apr 12: adding a semaphore to rsrc_load()
  545. *     Aug 04: pre-initialize internal <rsc> pointer (required for Calamus
  546. *              modules!)
  547. *
  548. *******************************************************************************/
  549. /*KEY _NAME="library for compiled resources" */
  550. /*END*/
  551.  
  552. /*******************************************************************************
  553. *                                                                              *
  554. *                                   INCLUDES                                   *
  555. *                                                                              *
  556. *******************************************************************************/
  557.  
  558. #include <stddef.h>
  559. #include <string.h>
  560. #include <aes.h>
  561.  
  562. #include "rsrc.h"
  563. /*KEY _END */
  564.  
  565.  
  566. /*******************************************************************************
  567. *                                                                              *
  568. *                                    MACROS                                    *
  569. *                                                                              *
  570. *******************************************************************************/
  571.  
  572. #define UNUSED(x) x = x             /* unused formal parameter */
  573.  
  574.  
  575. /*******************************************************************************
  576. *                                                                              *
  577. *                               TYPE DEFINITIONS                               *
  578. *                                                                              *
  579. *******************************************************************************/
  580.  
  581. typedef unsigned long ulong;        /* shortcut */
  582.  
  583. typedef struct                      /* resource file header (long format) */
  584.    {
  585.    ulong    vrsn;                   /* version # */
  586.    ulong    object;                 /* offset to first OBJECT */
  587.    ulong    tedinfo;                /* offset to first TEDINFO */
  588.    ulong    iconblk;                /* offset to first ICONBLK */
  589.    ulong    bitblk;                 /* offset to first BITBLK */
  590.    ulong    frstr;                  /* offset to ULONG array of offsets to */
  591.                                     /*  free strings */
  592.    ulong    string;                 /* offset to first string */
  593.    ulong    imdata;                 /* offset to base of image data */
  594.    ulong    frimg;                  /* offset to ULONG array of offsets to */
  595.                                     /*  free images */
  596.    ulong    trindex;                /* offset to ULONG array of offsets to */
  597.                                     /*  first OBJECT of trees */
  598.    ulong    nobs;                   /* # of OBJECTs */
  599.    ulong    ntree;                  /* # of trees */
  600.    ulong    nted;                   /* # of TEDINFOs */
  601.    ulong    nib;                    /* # of ICONBLKs */
  602.    ulong    nbb;                    /* # of BITBLKs */
  603.    ulong    nstring;                /* # of free strings */
  604.    ulong    nimages;                /* # of free images */
  605.    ulong    rssize;                 /* size of resource file */
  606.    } LONGHDR;
  607.  
  608. typedef struct                      /* resource descriptor: */
  609.    {
  610.    char     *name;                  /* ^resource name */
  611.    LONGHDR  *RSCLHDR;               /* address of resource header */
  612.    OBJECT   *object;                /* ^OBJECT array */
  613.    TEDINFO  *tedinfo;               /* ^TEDINFO array */
  614.    ICONBLK  *iconblk;               /* ^ICONBLK array */
  615.    BITBLK   *bitblk;                /* ^BITBLK array */
  616.    OBJECT   **trindex;              /* ^tree pointer array */
  617.    char     **frstr;                /* ^free string pointer array */
  618.    BITBLK   **frimg;                /* ^free image pointer array */
  619.    } RSCDES;
  620.  
  621.  
  622. /*******************************************************************************
  623. *                                                                              *
  624. *                               EXTERN REFERENCES                              *
  625. *                                                                              *
  626. *******************************************************************************/
  627.  
  628. extern ulong _numrsc;               /* # of resources in descriptor array */
  629. extern RSCDES _rdesar[];            /* resource descriptor array */
  630.  
  631.  
  632. /*******************************************************************************
  633. *                                                                              *
  634. *                                LOCAL PROTOTYPES                              *
  635. *                                                                              *
  636. *******************************************************************************/
  637.  
  638.    /* fix one object coordinate/size */
  639. static int obfix(int v,int size);
  640.  
  641.  
  642. /*******************************************************************************
  643. *                                                                              *
  644. *                             UNINITIALIZED STATICS                            *
  645. *                                                                              *
  646. *******************************************************************************/
  647.  
  648. static int  chr_w,chr_h;            /* character width and height in pixels */
  649. static RSCDES *rsc = _rdesar;       /* ^selected resource */
  650.  
  651.  
  652. /*******************************************************************************
  653. *                                                                              *
  654. *                                 LOCAL FUNCTIONS                              *
  655. *                                                                              *
  656. *******************************************************************************/
  657.  
  658. /*******************************************************************************
  659. *
  660. *  obfix: fix one object coordinate/size
  661. *
  662. *  An object coodinate or size is converted from screen-independend format to
  663. *  screen-dependend format.
  664. *
  665. *  screen-independend format:
  666. *     low byte  = character offset
  667. *     high byte = pixel offset
  668. *
  669. *  screen-dependend format:
  670. *     pixel offset
  671. *
  672. *  Out:
  673. *     value in screen-dependend format
  674. *
  675. *******************************************************************************/
  676.  
  677. static int obfix(
  678.  
  679. int         v,                      /* coordinate/size to fix */
  680. int         size)                   /* size factor (character width/height) */
  681. {
  682.  
  683.    return (v & 0xff) * size + ((v >> 8) & 0xff);
  684.  
  685. }     /* obfix() */
  686.  
  687.  
  688. /*******************************************************************************
  689. *                                                                              *
  690. *                                GLOBAL FUNCTIONS                              *
  691. *                                                                              *
  692. *******************************************************************************/
  693.  
  694. /*START*/
  695. /*******************************************************************************
  696. *
  697. *  rsrc_load: load resource into memory
  698. *
  699. *  "Loading" means initializing in this case: the object coordinates in the
  700. *  built-in resource(s) are adjusted to the current system font size.
  701. *
  702. *  Notes:
  703. *  - The argument (resource filename) is ignored.
  704. *  - If several resources are available (merged with the resource linker) then
  705. *    rsrc_load() will initialize _all_ of them.
  706. *
  707. *  Out:
  708. *     status (always 1 = ok)
  709. *
  710. *******************************************************************************/
  711.  
  712. int rsrc_load(
  713.  
  714. const char  *re_lpfname)            /* ^filename of resource (IGNORED) */
  715. {
  716. /*END*/
  717.  
  718.    static int semaphore = 0;        /* not initialized, yet */
  719.  
  720.    int      dummy;                  /* dummy buffer */
  721.    ulong    i,j;
  722.  
  723.  
  724.    UNUSED(re_lpfname);              /* we don't need the filename */
  725.  
  726.    if (semaphore)                   /* already initialized? */
  727.       return 1;                     /* then abort */
  728.  
  729.    semaphore = 1;                   /* set semaphore */
  730.  
  731.  
  732.                                     /* get size of system font's characters */
  733.    (void)graf_handle(&chr_w,&chr_h,&dummy,&dummy);
  734.  
  735.    for (j = _numrsc; j; )           /* initialize all resources */
  736.       {
  737.       rsc = &_rdesar[--j];          /* select resource */
  738.  
  739.                                     /* fix x/y/w/h of all objects */
  740.       for (i = 0; i < rsc->RSCLHDR->nobs; rsrc_obfix(rsc->object,(int)i++));
  741.       }
  742.  
  743.    return 1;
  744.  
  745. }     /* rsrc_load() */
  746.  
  747.  
  748. /*START*/
  749. /*******************************************************************************
  750. *
  751. *  rsrc_free: remove resource from memory
  752. *
  753. *  This version of rsrc_free() performs absolutely *nothing*!
  754. *
  755. *  Out:
  756. *     status (always 1 = ok)
  757. *
  758. *******************************************************************************/
  759.  
  760. int rsrc_free(void)
  761. {
  762. /*END*/
  763.  
  764.    return 1;
  765.  
  766. }     /* rsrc_free() */
  767.  
  768.  
  769. /*START*/
  770. /*******************************************************************************
  771. *
  772. *  rsrc_gaddr: get address of resource structure
  773. *
  774. *  Out:
  775. *     status:
  776. *     1                 ok
  777. *     0                 error (unknown type or invalid index)
  778. *
  779. *     ^structure in *gaddr (NULL if error occured)
  780. *
  781. *******************************************************************************/
  782.  
  783. int rsrc_gaddr(
  784.  
  785. int         re_gtype,               /* structure type (R_...) */
  786. int         re_gindex,              /* structure index */
  787. void        *gaddr)                 /* ^buffer for structure's address */
  788. {
  789. /*END*/
  790.  
  791.    int      stat;                   /* return status */
  792.  
  793.  
  794.    stat = (re_gindex >= 0);         /* index must be >= 0 !!! */
  795.  
  796.    if (stat) switch (re_gtype)      /* which structure type? */
  797.       {
  798.       case R_TREE:                  /* object tree */
  799.          if (re_gindex >= rsc->RSCLHDR->ntree) stat = 0;
  800.          else *(OBJECT **)gaddr = rsc->trindex[re_gindex];
  801.          break;
  802.  
  803.       case R_OBJECT:                /* object */
  804.          if (re_gindex >= rsc->RSCLHDR->nobs) stat = 0;
  805.          else *(OBJECT **)gaddr = rsc->object + re_gindex;
  806.          break;
  807.  
  808.       case R_TEDINFO:               /* text edit info */
  809.          if (re_gindex >= rsc->RSCLHDR->nted) stat = 0;
  810.          else *(TEDINFO **)gaddr = rsc->tedinfo + re_gindex;
  811.          break;
  812.  
  813.       case R_ICONBLK:               /* icon block */
  814.          if (re_gindex >= rsc->RSCLHDR->nib) stat = 0;
  815.          else *(ICONBLK **)gaddr = rsc->iconblk + re_gindex;
  816.          break;
  817.  
  818.       case R_BITBLK:                /* icon block */
  819.          if (re_gindex >= rsc->RSCLHDR->nbb) stat = 0;
  820.          else *(BITBLK **)gaddr = rsc->bitblk + re_gindex;
  821.          break;
  822.  
  823.       case R_STRING:                /* free string */
  824.          if (re_gindex >= rsc->RSCLHDR->nstring) stat = 0;
  825.          else *(char **)gaddr = rsc->frstr[re_gindex];
  826.          break;
  827.  
  828.       case R_IMAGEDATA:             /* free image */
  829.          if (re_gindex >= rsc->RSCLHDR->nimages) stat = 0;
  830.          else *(BITBLK **)gaddr = rsc->frimg[re_gindex];
  831.          break;
  832.  
  833.       case R_OBSPEC:                /* ob_spec */
  834.          if (re_gindex >= rsc->RSCLHDR->nobs) stat = 0;
  835.          else *(long *)gaddr = rsc->object[re_gindex].ob_spec.index;
  836.          break;
  837.  
  838.       case R_TEPTEXT:               /* text ^ */
  839.          if (re_gindex >= rsc->RSCLHDR->nted) stat = 0;
  840.          else *(char **)gaddr = rsc->tedinfo[re_gindex].te_ptext;
  841.          break;
  842.  
  843.       case R_TEPTMPLT:              /* template ^ */
  844.          if (re_gindex >= rsc->RSCLHDR->nted) stat = 0;
  845.          else *(char **)gaddr = rsc->tedinfo[re_gindex].te_ptmplt;
  846.          break;
  847.  
  848.       case R_TEPVALID:              /* validation ^ */
  849.          if (re_gindex >= rsc->RSCLHDR->nted) stat = 0;
  850.          else *(char **)gaddr = rsc->tedinfo[re_gindex].te_pvalid;
  851.          break;
  852.  
  853.       case R_IBPMASK:               /* icon mask ^ */
  854.          if (re_gindex >= rsc->RSCLHDR->nib) stat = 0;
  855.          else *(int **)gaddr = rsc->iconblk[re_gindex].ib_pmask;
  856.          break;
  857.  
  858.       case R_IBPDATA:               /* icon data ^ */
  859.          if (re_gindex >= rsc->RSCLHDR->nib) stat = 0;
  860.          else *(int **)gaddr = rsc->iconblk[re_gindex].ib_pdata;
  861.          break;
  862.  
  863.       case R_IPBTEXT:               /* icon text ^ */
  864.          if (re_gindex >= rsc->RSCLHDR->nib) stat = 0;
  865.          else *(char **)gaddr = rsc->iconblk[re_gindex].ib_ptext;
  866.          break;
  867.  
  868.       case R_BIPDATA:               /* image data ^ */
  869.          if (re_gindex >= rsc->RSCLHDR->nbb) stat = 0;
  870.          else *(int **)gaddr = rsc->bitblk[re_gindex].bi_pdata;
  871.          break;
  872.  
  873.       case R_FRSTR:                 /* free string ^ table */
  874.          if (re_gindex >= rsc->RSCLHDR->nstring) stat = 0;
  875.          else *(char ***)gaddr = rsc->frstr + re_gindex;
  876.          break;
  877.  
  878.       case R_FRIMG:                 /* free image ^ table */
  879.          if (re_gindex >= rsc->RSCLHDR->nimages) stat = 0;
  880.          else *(BITBLK ***)gaddr = rsc->frimg + re_gindex;
  881.          break;
  882.  
  883.       default:                      /* unknown */
  884.          stat = 0;
  885.       }
  886.  
  887.    if (!stat)                       /* error? */
  888.       *(char **)gaddr = NULL;       /* then clear return ^ */
  889.  
  890.    return stat;
  891.  
  892. }     /* rsrc_gaddr() */
  893.  
  894.  
  895. /*START*/
  896. /*******************************************************************************
  897. *
  898. *  rsrc_saddr: set address of resource structure
  899. *
  900. *  Out:
  901. *     status:
  902. *     1                 ok
  903. *     0                 error (unknown type or invalid index)
  904. *
  905. *******************************************************************************/
  906.  
  907. int rsrc_saddr(
  908.  
  909. int         re_stype,               /* structure type (R_FRSTR or R_FRIMG) */
  910. int         re_sindex,              /* structure index */
  911. void        *saddr)                 /* new address of structure */
  912. {
  913. /*END*/
  914.  
  915.    int      stat;                   /* return status */
  916.  
  917.  
  918.    stat = (re_sindex >= 0);         /* index must be >= 0 !!! */
  919.  
  920.    if (stat) switch (re_stype)      /* which structure type? */
  921.       {
  922.       case R_FRSTR:                 /* free string ^ table */
  923.          if (re_sindex >= rsc->RSCLHDR->nstring) stat = 0;
  924.          else rsc->frstr[re_sindex] = saddr;
  925.          break;
  926.  
  927.       case R_FRIMG:                 /* free image ^ table */
  928.          if (re_sindex >= rsc->RSCLHDR->nimages) stat = 0;
  929.          else rsc->frimg[re_sindex] = saddr;
  930.          break;
  931.  
  932.       default:                      /* unknown */
  933.          stat = 0;
  934.       }
  935.  
  936.    return stat;
  937.  
  938. }     /* rsrc_saddr() */
  939.  
  940.  
  941. /*START*/
  942. /*******************************************************************************
  943. *
  944. *  rsrc_obfix: adjust object coordinates to screen font size
  945. *
  946. *  Position and size of an object is converted from the screen-independend
  947. *  format (created by a resource editor) to the screen-dependend format
  948. *  (required to display dialogs).
  949. *
  950. *  Note: don't use this function before rsrc_load() has been called
  951. *
  952. *  Out:
  953. *     status:
  954. *     1                 ok
  955. *     0                 error (invalid object index)
  956. *
  957. *******************************************************************************/
  958.  
  959. int rsrc_obfix(
  960.  
  961. OBJECT      *re_otree,              /* ^object tree */
  962. int         re_oobject)             /* object index */
  963. {
  964. /*END*/
  965.  
  966.    if (re_oobject < 0)              /* invalid index? */
  967.       return 0;                     /* then abort */
  968.  
  969.    re_otree += re_oobject;          /* ^object */
  970.  
  971.    re_otree->ob_x      = obfix(re_otree->ob_x,chr_w);       /* fix x */
  972.    re_otree->ob_y      = obfix(re_otree->ob_y,chr_h);       /* fix y */
  973.    re_otree->ob_width  = obfix(re_otree->ob_width,chr_w);   /* fix width */
  974.    re_otree->ob_height = obfix(re_otree->ob_height,chr_h);  /* fix height */
  975.  
  976.    return 1;
  977.  
  978. }     /* rsrc_obfix() */
  979.  
  980.  
  981. /*START*/
  982. /*******************************************************************************
  983. *
  984. *  rsrc_select: select resource by name
  985. *
  986. *  This function is _not_ included in regular AES libraries. It's a special
  987. *  extension only available in the resource compiler package. Use it if you
  988. *  like to work with several resources in one application.
  989. *
  990. *  The function selects one of the resources bound by the resource linker by
  991. *  its filename (without extension!). All further rsrc_... operations will
  992. *  work with the selected resource.
  993. *
  994. *  The resource name may end with an asterisk character (*) as wildcard. In that
  995. *  case the first resource beginning with that name is used (e.g. "MEN*" will
  996. *  select the first resource which name starts with "MEN").
  997. *
  998. *  Out:
  999. *     status:
  1000. *     1                 ok
  1001. *     0                 error (no resource found with that name)
  1002. *
  1003. *******************************************************************************/
  1004.  
  1005. int rsrc_select(
  1006.  
  1007. char        *re_sname)              /* ^name of resource (filename of the */
  1008.                                     /*  RSC file without extension in capital */
  1009.                                     /*  letters; optional with * wildcard) */
  1010. {
  1011. /*END*/
  1012.  
  1013.    char     *w;                     /* ^wildcard */
  1014.    ulong    len,                    /* length of name without wildcard */
  1015.             i;                      /* counter */
  1016.  
  1017.  
  1018.    w = strchr(re_sname,'*');                 /* find wildcard */
  1019.  
  1020.    if (w)                                    /* found? */
  1021.       {
  1022.       len = (size_t)(w - re_sname);          /* size of name */
  1023.  
  1024.       for (i = 0; i < _numrsc; i++)          /* search all resources */
  1025.          if (!strncmp(re_sname,_rdesar[i].name,len))  /* found? */
  1026.             {
  1027.             rsc = &_rdesar[i];               /* switch to this resource */
  1028.  
  1029.             return 1;                        /* succeeded */
  1030.             }
  1031.       }
  1032.    else                                      /* name without wildcard: */
  1033.       for (i = 0; i < _numrsc; i++)          /* search all resources */
  1034.          if (!strcmp(re_sname,_rdesar[i].name)) /* found? */
  1035.             {
  1036.             rsc = &_rdesar[i];               /* switch to this resource */
  1037.  
  1038.             return 1;                        /* succeeded */
  1039.             }
  1040.  
  1041.    return 0;                                 /* not found: error */
  1042.  
  1043. }     /* rsrc_select() */
  1044.  
  1045.  
  1046. /*EOF*/
  1047. /*TAB=3***CHAR={ATARI}**********************************************************
  1048. *
  1049. *  Project name : GENERAL C LIBRARY FOR TOS APPLICATIONS
  1050. *  Header name  : Definitions for compiled resources
  1051. *  Symbol prefix: rsrc
  1052. *
  1053. *  Author       : Harald Siegmund (HS)
  1054. *  Co-Authors   : -
  1055. *  Write access : HS
  1056. *
  1057. *  Notes        : -
  1058. *-------------------------------------------------------------------------------
  1059. *  Things to do : -
  1060. *
  1061. *-------------------------------------------------------------------------------
  1062. *  History:
  1063. *
  1064. *  1994:
  1065. *     Mar 01: introduced
  1066. *
  1067. *******************************************************************************/
  1068. /*KEY _NAME="definitions for compiled resources" */
  1069. /*END*/
  1070.  
  1071. #ifndef __RSRC
  1072. #define __RSRC
  1073.  
  1074. /*******************************************************************************
  1075. *                                                                              *
  1076. *                                   INCLUDES                                   *
  1077. *                                                                              *
  1078. *******************************************************************************/
  1079.  
  1080. #include <aes.h>                    /* include AES definitions */
  1081. /*KEY _END */
  1082.  
  1083.  
  1084. /*******************************************************************************
  1085. *                                                                              *
  1086. *                                  PROTOTYPES                                  *
  1087. *                                                                              *
  1088. *******************************************************************************/
  1089.  
  1090.       /* functions in RSRC.C: */
  1091.  
  1092.    /* select resource by name */
  1093. int rsrc_select(char *re_sname);
  1094.  
  1095.  
  1096.    /* more prototypes of the rsrc_... functions can be found in AES.H */
  1097.  
  1098.  
  1099. #endif      /* #ifndef __RSRC */
  1100.  
  1101. /*EOF*/
  1102. N·⇦αê~❎µ?⇨4ג|¯דIJ6αCה|¯קC0⇩6NuHτ⑧ UOE∙HWHo⇦CΩ¯³AΩ¯ⁿN¨PO&9`4Sâ ⇨τêסâσêA∙עij$êx`⓪ ⇦Rä R h✓N¨ R h⇦Õ¿(eΣJâfזp⇧TOL∞⇦⑧Nup⇧NuHτ⑧06⇧&HJCk⇦x⇧`⇩BDJDg⇨E∙2Ø|⓪b⇩∈פA2;⓪╱N√⓪⇩"Htáכ°⇧⇧D⇧p⇧£⇧ז⇧⌠⇩ ⇩L⇩v⇩ß⇩ij0⇨Hij R h⇦ã¿,d⇩ã0⇨Hijσê R h⑧&ã✓`⇩ß0⇨Hij R h⇦ã¿(d⇩è2⇨HIJ ⇧סÇסüτê R h✓עij&ê`⇩r0⇨Hij R h⇦ã¿0d⇩^2⇨HIJ ⇧τêÉüσê R h עij&ê`⇩F0⇨Hij R h⇦ã¿4d⇩22⇨HIJ ⇧ΘêסüסÇ R h⓪עij&ê`⇩ə0⇨Hij R h⇦ã¿8d⇩╱2⇨HIJ ⇧τêÉüסÇ R h④עij&ê`⇧∈0⇨Hij R h⇦ã¿<d⇧ם0⇨Hijσê R h&ã✓`⇧ז0⇨Hij R h⇦ã¿@d⇧œ0⇨Hijσê R h &ã✓`⇧ó0⇨Hij R h⇦ã¿(d⇧Ä2⇨HIJ ⇧סÇסüτê R h✓&ã✓ `⇧v0⇨Hij R h⇦ã¿0d⇧b2⇨HIJ ⇧τêÉüσê R h &ã✓`⇧J0⇨Hij R h⇦ã¿0d⇧62⇨HIJ ⇧τêÉüσê R h &ã✓⇦`⇧0⇨Hij R h⇦ã¿0d⇧
  1103. 2⇨HIJ ⇧τêÉüσê R h &ã✓✓`≥0⇨Hij R h⇦ã¿4d∧2⇨HIJ ⇧ΘêסüסÇ R h⓪&ã✓`ה0⇨Hij R h⇦ã¿4dØ2⇨HIJ ⇧ΘêסüסÇ R h⓪&ã✓⇦`Ü0⇨Hij R h⇦ã¿4då2⇨HIJ ⇧ΘêסüסÇ R h⓪&ã✓✓`n0⇨Hij R h⇦ã¿8d\2⇨HIJ ⇧τêÉüסÇ R h④&ã✓`F0⇨Hij R h⇦ã¿<d40⇨Hijσê R hעij&ê`$0⇨Hij R h⇦ã¿@d②0⇨Hijσê R h עij&ê`⇩BDJDf⇩Bô0⇦L∞ ⑧Nu?⇨/
  1104. JAk⇦t⇧`⇩BBJBgZC∙6û|g╱SCg$`D0⇧Hij$Q$j⇦ã¬<d40⇧Hijσê$Q$j%ê✓`$0⇧Hij$Q$j⇦ã¬@d②0⇧Hijσê$Q$j %ê✓`⇩BB0⇩$_6Nu?⇨/
  1105. $H6JCj⇦B@`X2⇨HIJ ⇧סÇסüτêרij290*⓪a5@⓪290*②a5@②290*④a5@④290*⑥a5@⑥p⇧$_6NuHτ⓪0&HvE∙`0 ⇨τêסâσê"r✓ KN¨J@f⑥ ⇨τêסâσêA≥✓#זp⇧` RâÀ¨eזB@L∞ ✓Nu⇨¯¯    ◆ə✓♪✓⇨♪④⓪♪✓⇦♪②    ♪⑧
  1106. ◆╱◆⇦ ♪ə⇨⇩⇨◆
  1107. ♪♪④⇨◆`
  1108. ♪ 
  1109. ♪✓❎
  1110. ♪✓
  1111. ♪✓❎
  1112. ◆◆♪
  1113.     ♪⑥♪⑥⇨♪ ⇦❎¯¯    ⇩
  1114. ⇩❎
  1115. ⇩⇨⇧⇦¯¯⇨rsc◆_numrsc❎chr_h    rsrc_free♪rsrc_select    rsrc_load◆_rdesar
  1116. rsrc_obfix
  1117. rsrc_saddr
  1118. rsrc_gaddr╱strcmp❎obfix❎chr_w♪graf_handleQDB2✓⇧h⇩vá⇩α⇦t⇦" ⇩™ə¡⇦⇧╱⇩⇩④⇧⇦✓lס
  1119. ╱⇨╱⇩⑥⇩✓⇨④√ ✓⇦⇩⇩⇧✓╱⇦°⇨❎⇩⇩⇧⇩ ⇨$⇧<⇧♪✓⇩
  1120. ⇨B⇧②⇧⓪⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⓪⇨⇦⇧②⇧⓪⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇦⇧②⇧⑥⇨⇩⇧⓪⇧⑥⇨⇩⇧⓪⇧⓪⇨⇩⇧⓪⇧⓪⇨⇩⇨⇩⇧⇦⇩⇩⇩⇩⇧╱♪t⇧ï⇧♪⇦⇩
  1121. ⇨⑧⇧⓪⇧⓪⇨⇩⇧⓪⇧⓪⇨⇩⇨⇩⇩⇩⇧╱
  1122. n⇧™♪⇧◆✓⇧⇦⇩⇦⇩⇧②⇧②⇧②⇩②⇩⇩⇧╱◆P⇧Θ    ⇧♪╱⇧
  1123. ⇩⑧⇩②√⇦✓
  1124. ⇩⇩⇧╱⇨⇧⇧⓪⇧⇨⇧╱⓪⇩⇧✓ ⇨⇩⇧
  1125.  ⇦⇩⇩ ⓪⇨⇧②@✓⇩⇧⓪⇦⇨⇧"`♪⇨⇧(⓪⇨⇨⇧2⓪⇩⇧⓪⇩⇨⇧;`✓⇨⇧A⓪⇧⇨⇧K⓪⇨⇧T⓪⇨⇨⇧_⇩P
  1126. ⇩⇧
  1127.  ⇨⇨⇧⇩À⇧`♪❎╱⇩ת⇩ij⇨❎╱⇨E⓪❎◆⇦⇨K⇩ס❎╱⇨Q⓪⇧⇨WÉ⇧⇨a⇧ã⇧⇨k⇧ij✓⇦⇨v⇩ס╱✓⇦⇨Ç⇩ס◆✓⇦⇨î⇩ס✓✓⇦⇨û⇩ס
  1128. ✓⇦⇨í⇩ס♪✓⇦⇨¼⇩ס ⇨Ãá⇨IJ⇧≡⇨ז⇧ij⇨מÉ⇨ר ⇨ף⇧ã⇨Σ⇩p⇨∮⇧@⇨⌠ ⇨√p⇦⇩ij⇦♪⇩⓪⇦③⇩`⇦ə⇧Ç⇨✓④⇧^⇩⇧◆◆ⁿ⇧⇧⇧⇩⇩⑤⇧⇩⇧⇦✓╱_⇧⇨⇧⇦T ✓⇨⑦⇧⇦⇧⇦î♪⇦k⇧❎⇧⇩ג
  1129. ✓a⇧╱⇧⇩α◆╱E⇨⇩╱⇦⇧Ω⇧@⇧♪❎⇦0
  1130. ♪❎⇦P⑧⇩0⇩¼♪⇦⇩⇦⇧4⇩@    ❎⇦⇧Ø♪❎⇦É⇦⇩>◆①⇩Ç✓①⇩⓪✓✓①⇩Ç⇦①⇩Ç⇦⇦①⇩Ç✓⇧①⇩Ç    ⇨①⇩Ç ⇦⇩④T♪⇧⇧♪❎⇦⇧P♪❎⇦⇧@"⇩hן♪❎⇦⓪♪❎⇦⇧Ç&⇧B⇧ז⇩⑥⇧P⇧Ç╱♪❎⇦⇧ij♪❎⇦⇧ã⇧ij⇧α╱♪❎⇦⇧≡✓⇩L⇩(⇩⓪,⓪♪❎⇦♪❎⇦⇩⓪♪❎⇦p$⇩Z⇦✓    H⇩╱⇨0②♪❎⇦⇩p♪❎⇦⇩P♪❎⇦⇧`♪❎⇦⇩♪❎⇦⇩`⓪(⓪hסrα|⇩≡à⇩⇧ì⇩⇧⓪û⇩⇧ ó⇩⇧0«⇧`Ã⇦⇧`IJ✓⇧`י ⓪צ⓪ץ⓪⓪Σ②⓪ϕ④⓪÷⑥⓪⇧⇨⑧⓪⇧ə⓪⇧⑦⇧É⇧ ⇦⇧É⇧)✓⇧`⇧2 ⓪⇧:⓪⇧C⓪⓪⇧L②⓪⇧U④⓪⇧^⑥⓪⇧g⑧⓪⇧pə⓪⇧y⓪⇧é⓪⇧ï ⓪⇧ö⓪⇧ƒ⇩⇧É⇧¿╱⇧É⇧õ
  1131. ⇧É⇧´⇧É⇧ב②⇧ס⇧כ⇧Ç⇧ק"⇧ס⇧§⇧É⇧µ⇦⓪⇧∮╱⓪⇧≥✓⓪⇧≈
  1132. ⓪⇧ⁿ ⓪⇩❎⇩0⇩⇦á⇩⑤á⇩ã⇩$ij⇩+⇧p⇩3⇧á⇩;⇧α⇩D⇩⇩K⇩@⇩S⇧`⇩_⓪⇩g⇩⓪⇩o⇦⓪⇩w╱Ç⇩✓Ç⇩ê
  1133. Ç⇩æ É⇩Ö⓪⓪⇩ß②⓪⇩ú④⓪⇩¼⑥⓪⇩ף ⇩α⇦ ⇩+✓ ⇩3  ⇩D⓪ ⇩τ④ ⇩ϕ⑧ ⇩⌠ ⇩√  ⇨⇧$ ⇨    ( ⇨, ⇨④0 ⇨⑨4 ⇨8 ⇨!< ⇨)@ ⇨1D ⇨8⇧`⇨=⇦⇩Ç⇩α✓⇩P⇩+ ⇧p⇩3⓪⇧á⇩D④⇩⇨⇧⑧⇩É⇩τ⇩á⇩√ ⇩ãsizevjidummyre_lpfnamestatgaddrre_gindexre_gtypesaddrre_sindexre_stypere_oobjectre_otreecharacterframesizeframecoltextcoltextmodefillpatterninteriorcolte_ptextte_ptmpltte_pvalidte_fontte_junk1te_justte_colorte_junk2te_thicknesste_txtlente_tmplenib_pmaskib_pdataib_ptextib_charib_xcharib_ycharib_xiconib_yiconib_wiconib_hiconib_xtextib_ytextib_wtextib_htextnum_planescol_datacol_masksel_datasel_masknext_resmonoblkmainlistbi_pdatabi_wbbi_hlbi_xbi_ybi_colorub_codeub_parmindexindirectobspectedinfoiconblkciconblkbitblkuserblkfree_stringob_nextob_headob_tailob_typeob_flagsob_stateob_specob_xob_yob_widthob_heightre_snameD:\OPEN\RCOM\LIB\RSRC.CrscvrsnobjectfrstrstringimdatafrimgtrindexnobsntreentednibnbbnstringnimagesrssizenameRSCLHDRchr_hobfixchr_wobspecptrcicon_blkcicon_datarsrc_freersrc_selectrsrc_loadrsrc_obfixrsrc_saddrrsrc_gaddrptrdiff_tBITBLKCICONOBSPECulongCICONBLKLONGHDRTEDINFOsize_tOBJECTbfobspecUSERBLKRSCDESICONBLK/*TAB=3***CHAR=ATARI************************************************************
  1134. *
  1135. *  Project name : GEM RESOURCE COMPILER
  1136. *  Module name  : Main module
  1137. *  Symbol prefix: -
  1138. *
  1139. *  Author       : Harald Siegmund (HS)
  1140. *  Co-Authors   : -
  1141. *  Write access : HS
  1142. *
  1143. *  Notes        : -
  1144. *-------------------------------------------------------------------------------
  1145. *  Things to do : -
  1146. *
  1147. *-------------------------------------------------------------------------------
  1148. *  History:
  1149. *
  1150. *  1990:
  1151. *     Apr 05: creation of file
  1152. *     Jul 17: 32K resource size boundary removed (this was a bug!)
  1153. *     Sep 12: RCOM now accepts resource files created by Kuma RCS
  1154. *     Oct 09: add some symbols to compiled resource files (used by
  1155. *             new RSC.C)
  1156. *  1991:
  1157. *     Feb 28: minor changes
  1158. *     Jun 06: ignore high byte of object types!
  1159. *  1993:
  1160. *     Aug 30: long resource header format
  1161. *             new file header
  1162. *             adding _DAY, _MONTH, _YEAR; changing messages
  1163. *  1994:
  1164. *     Mar 01: new concept: resource descriptor instead of symbols directly
  1165. *              accessing the compiled data
  1166. *     Mar 10: write errors to stderr instead of stdout
  1167. *             adding RELEASE number
  1168. *             debugging: symbol name was overwritten by resource name
  1169. *
  1170. *******************************************************************************/
  1171. /*KEY _NAME="GEM resource compiler" */
  1172. /*KEY &RELEASE */
  1173. /*KEY _DAY=0x */
  1174. /*KEY _MONTH=0x */
  1175. /*KEY _YEAR=0x */
  1176. /*END*/
  1177.  
  1178.  
  1179. /**************************************************************************/
  1180. /*                                                                        */
  1181. /*                            INCLUDE FILES                               */
  1182. /*                                                                        */
  1183. /**************************************************************************/
  1184.  
  1185. #include <stdio.h>
  1186. #include <stdlib.h>
  1187. #include <stdarg.h>
  1188. #include <string.h>
  1189. #include <tos.h>
  1190. #include <aes.h>
  1191.  
  1192.  
  1193. /**************************************************************************/
  1194. /*                                                                        */
  1195. /*                                MACROS                                  */
  1196. /*                                                                        */
  1197. /**************************************************************************/
  1198.  
  1199. #ifndef RELEASE                     /* not translated with Make Control? */
  1200. #   define RELEASE   2              /* release number */
  1201. #   define _DAY      0x10           /* release date (BCD) */
  1202. #   define _MONTH    0x03
  1203. #   define _YEAR     0x1994
  1204. #endif
  1205.  
  1206.  
  1207. #define MS_ERRDEV stdaux            /* device for warnings and errors */
  1208.  
  1209.  
  1210. #define MAX_FSIZE    256            /* max size of filespec incl. terminator */
  1211. #define RELINFO      0x00050001L    /* 5:long relocation, 1:data segment */
  1212.  
  1213.  
  1214. /* this macro calculates the offset of a structure element to the start of
  1215.    the structure in bytes */
  1216.  
  1217. #define SOFF(type,label) ((ULONG)((char *)(&((type *)NULL)->label) - (char *)NULL))
  1218.  
  1219.  
  1220. #define TRUE      1                 /* boolean */
  1221. #define FALSE     0
  1222.  
  1223.  
  1224. /**************************************************************************/
  1225. /*                                                                        */
  1226. /*                          TYPE DEFINITIONS                              */
  1227. /*                                                                        */
  1228. /**************************************************************************/
  1229.  
  1230. typedef unsigned int UINT;          /* shortcuts */
  1231. typedef unsigned long ULONG;
  1232.  
  1233.  
  1234. typedef struct                      /* resource file header */
  1235.    {
  1236.    UINT     vrsn;                   /* version # (0) */
  1237.    UINT     object;                 /* offset to first OBJECT */
  1238.    UINT     tedinfo;                /* offset to first TEDINFO */
  1239.    UINT     iconblk;                /* offset to first ICONBLK */
  1240.    UINT     bitblk;                 /* offset to first BITBLK */
  1241.    UINT     frstr;                  /* offset to ULONG array of offsets to */
  1242.                                     /*  free strings */
  1243.    UINT     string;                 /* offset to first string */
  1244.    UINT     imdata;                 /* offset to base of image data */
  1245.    UINT     frimg;                  /* offset to ULONG array of offsets to */
  1246.                                     /*  free images */
  1247.    UINT     trindex;                /* offset to ULONG array of offsets to */
  1248.                                     /*  first OBJECT of trees */
  1249.    UINT     nobs;                   /* # of OBJECTs */
  1250.    UINT     ntree;                  /* # of trees */
  1251.    UINT     nted;                   /* # of TEDINFOs */
  1252.    UINT     nib;                    /* # of ICONBLKs */
  1253.    UINT     nbb;                    /* # of BITBLKs */
  1254.    UINT     nstring;                /* # of free strings */
  1255.    UINT     nimages;                /* # of free images */
  1256.    UINT     rssize;                 /* size of resource file */
  1257.    } RHDR;
  1258.  
  1259. /* any offset 0: data not available */
  1260.  
  1261.  
  1262. typedef struct                      /* resource file header (long format) */
  1263.    {
  1264.    ULONG    vrsn;                   /* version # */
  1265.    ULONG    object;                 /* offset to first OBJECT */
  1266.    ULONG    tedinfo;                /* offset to first TEDINFO */
  1267.    ULONG    iconblk;                /* offset to first ICONBLK */
  1268.    ULONG    bitblk;                 /* offset to first BITBLK */
  1269.    ULONG    frstr;                  /* offset to ULONG array of offsets to */
  1270.                                     /*  free strings */
  1271.    ULONG    string;                 /* offset to first string */
  1272.    ULONG    imdata;                 /* offset to base of image data */
  1273.    ULONG    frimg;                  /* offset to ULONG array of offsets to */
  1274.                                     /*  free images */
  1275.    ULONG    trindex;                /* offset to ULONG array of offsets to */
  1276.                                     /*  first OBJECT of trees */
  1277.    ULONG    nobs;                   /* # of OBJECTs */
  1278.    ULONG    ntree;                  /* # of trees */
  1279.    ULONG    nted;                   /* # of TEDINFOs */
  1280.    ULONG    nib;                    /* # of ICONBLKs */
  1281.    ULONG    nbb;                    /* # of BITBLKs */
  1282.    ULONG    nstring;                /* # of free strings */
  1283.    ULONG    nimages;                /* # of free images */
  1284.    ULONG    rssize;                 /* size of resource file */
  1285.    } LONGHDR;
  1286.  
  1287. /* any offset 0: data not available */
  1288.  
  1289.  
  1290. typedef struct                      /* resource descriptor: */
  1291.    {
  1292.    ULONG    name;                   /* offset to resource name */
  1293.    ULONG    RSCLHDR;                /* offset to resource header */
  1294.    ULONG    object;                 /* offset to OBJECT array */
  1295.    ULONG    tedinfo;                /* offset to TEDINFO array */
  1296.    ULONG    iconblk;                /* offset to ICONBLK array */
  1297.    ULONG    bitblk;                 /* offset to BITBLK array */
  1298.    ULONG    trindex;                /* offset to tree pointer array */
  1299.    ULONG    frstr;                  /* offset to free string pointer array */
  1300.    ULONG    frimg;                  /* offset to free image pointer array */
  1301.    } RSCDES;
  1302.  
  1303.  
  1304. typedef struct                      /* object file header */
  1305.    {
  1306.    int      magic;                  /* magic word */
  1307.    ULONG    text_size;              /* size of text segment */
  1308.    ULONG    data_size;              /* size of data segment */
  1309.    ULONG    bss_size;               /* size of bss segment */
  1310.    ULONG    symb_size;              /* size of symbol table */
  1311.    long     resvd1;                 /* reserved */
  1312.    long     resvd2;                 /* reserved */
  1313.    int      resvd3;                 /* reserved */
  1314.    } OHDR;
  1315.  
  1316.  
  1317. typedef struct                      /* resource header component descriptor: */
  1318.    {
  1319.    long     srcoff;                 /* offset to UINT in short resource header*/
  1320.    long     dstoff;                 /* offset to ULONG in long resource header*/
  1321.    int      oflag;                  /* TRUE = this is a file offset */
  1322.    } HDDES;
  1323.  
  1324.  
  1325. /**************************************************************************/
  1326. /*                                                                        */
  1327. /*                          LOCAL PROTOTYPES                              */
  1328. /*                                                                        */
  1329. /**************************************************************************/
  1330.  
  1331.    /* display error message and abort process */
  1332. static void ms_error(char *cs,...);
  1333.  
  1334.    /* display error message "out of memory" and abort process */
  1335. static void ms_mfull(void);
  1336.  
  1337.    /* read bytes from file */
  1338. static void file_read(int fh,char *pfname,long size,void *p);
  1339.  
  1340.    /* write bytes to file */
  1341. static void file_write(int fh,char *pfname,long size,void *p);
  1342.  
  1343.    /* write symbol to object file */
  1344. static void write_symbol(char **pp,char *pname,long value);
  1345.  
  1346.    /* read resource header */
  1347. static void read_header(int fh,char *fspec,LONGHDR *hd,long *off);
  1348.  
  1349.    /* compile resource */
  1350. static void comp_rsc(char *pifile,char *pofile);
  1351.  
  1352.  
  1353.  
  1354. /*******************************************************************************
  1355. *                                                                              *
  1356. *                              INITIALIZED STATICS                             *
  1357. *                                                                              *
  1358. *******************************************************************************/
  1359.  
  1360. static HDDES convdes[] =            /* header component descriptors: */
  1361.    {
  1362.       {SOFF(RHDR,vrsn),SOFF(LONGHDR,vrsn),FALSE},
  1363.       {SOFF(RHDR,object),SOFF(LONGHDR,object),TRUE},
  1364.       {SOFF(RHDR,tedinfo),SOFF(LONGHDR,tedinfo),TRUE},
  1365.       {SOFF(RHDR,iconblk),SOFF(LONGHDR,iconblk),TRUE},
  1366.       {SOFF(RHDR,bitblk),SOFF(LONGHDR,bitblk),TRUE},
  1367.       {SOFF(RHDR,frstr),SOFF(LONGHDR,frstr),TRUE},
  1368.       {SOFF(RHDR,string),SOFF(LONGHDR,string),TRUE},
  1369.       {SOFF(RHDR,imdata),SOFF(LONGHDR,imdata),TRUE},
  1370.       {SOFF(RHDR,frimg),SOFF(LONGHDR,frimg),TRUE},
  1371.       {SOFF(RHDR,trindex),SOFF(LONGHDR,trindex),TRUE},
  1372.       {SOFF(RHDR,nobs),SOFF(LONGHDR,nobs),FALSE},
  1373.       {SOFF(RHDR,ntree),SOFF(LONGHDR,ntree),FALSE},
  1374.       {SOFF(RHDR,nted),SOFF(LONGHDR,nted),FALSE},
  1375.       {SOFF(RHDR,nib),SOFF(LONGHDR,nib),FALSE},
  1376.       {SOFF(RHDR,nbb),SOFF(LONGHDR,nbb),FALSE},
  1377.       {SOFF(RHDR,nstring),SOFF(LONGHDR,nstring),FALSE},
  1378.       {SOFF(RHDR,nimages),SOFF(LONGHDR,nimages),FALSE},
  1379.       {SOFF(RHDR,rssize),SOFF(LONGHDR,rssize),TRUE},
  1380.       {-1,-1,0}
  1381.    };
  1382.  
  1383.  
  1384. /**************************************************************************/
  1385. /*                                                                        */
  1386. /*                           LOCAL FUNCTIONS                              */
  1387. /*                                                                        */
  1388. /**************************************************************************/
  1389.  
  1390. /*******************************************************************************
  1391. *
  1392. *  ms_error: display error message and abort process
  1393. *
  1394. *  A message is printed in the form:
  1395. *  rcom: error: <cs>...
  1396. *
  1397. *  Then all open files are closed, allocated memory blocks are freed and the
  1398. *  process is terminated.
  1399. *
  1400. *  Out:
  1401. *     -
  1402. *
  1403. *******************************************************************************/
  1404.  
  1405. static void ms_error(
  1406.  
  1407. char        *cs,                    /* ^ to printf-like control string */
  1408.             ...)                    /* any parameters for printf() */
  1409. {
  1410.  
  1411.    va_list  arg;                    /* ^ to argument list for vprintf() */
  1412.  
  1413.  
  1414.                                     /* display message header */
  1415.    fprintf(MS_ERRDEV,"\n\x07rcom: ERROR: ");
  1416.    va_start(arg,cs);                /* init argument ^ */
  1417.    vfprintf(MS_ERRDEV,cs,arg);      /* print ... */
  1418.    va_end(arg);                     /* finished */
  1419.  
  1420.    exit(1);                         /* terminate */
  1421.  
  1422. }     /* ms_error() */
  1423.  
  1424.  
  1425. /*******************************************************************************
  1426. *
  1427. *  ms_mfull: display error message "out of memory" and abort process
  1428. *
  1429. *  The following message is printed:
  1430. *  rcom: error: out of memory
  1431. *
  1432. *  Then all open files are closed, allocated memory blocks are freed and the
  1433. *  process is terminated.
  1434. *
  1435. *  Out:
  1436. *     -
  1437. *
  1438. *******************************************************************************/
  1439.  
  1440. static void ms_mfull(void)
  1441. {
  1442.  
  1443.    ms_error("out of memory\n");
  1444.  
  1445. }     /* ms_mfull() */
  1446.  
  1447.  
  1448. /***************************************************************************
  1449. *
  1450. *  file_read: read data from file
  1451. *
  1452. *  Out:
  1453. *        -
  1454. *
  1455. ***************************************************************************/
  1456.  
  1457. static void file_read(fh,pfname,size,p)
  1458.  
  1459. int         fh;                     /* file handle */
  1460. char        *pfname;                /* ^ to filename */
  1461. long        size;                   /* # of bytes to reade */
  1462. void        *p;                     /* ^ to buffer */
  1463. {
  1464.  
  1465.    long     n;                      /* # of read bytes/status */
  1466.  
  1467.  
  1468.    n = Fread(fh,size,p);            /* read! */
  1469.    if (n >= 0 && n != size)         /* not all bytes read? */
  1470.       n = -11;                      /* read fault */
  1471.  
  1472.    if (n < 0)                       /* error? */
  1473.       ms_error("can't read file %s (error code %d)\n",pfname,(int)n);
  1474.  
  1475. }     /* file_read() */
  1476.  
  1477.  
  1478.  
  1479.  
  1480. /***************************************************************************
  1481. *
  1482. *  file_write: write data into file
  1483. *
  1484. *  Out:
  1485. *        -
  1486. *
  1487. ***************************************************************************/
  1488.  
  1489. static void file_write(fh,pfname,size,p)
  1490.  
  1491. int         fh;                     /* file handle */
  1492. char        *pfname;                /* ^ to filename */
  1493. long        size;                   /* # of bytes to write */
  1494. void        *p;                     /* ^ to data to write */
  1495. {
  1496.  
  1497.    long     n;                      /* # of written bytes/status */
  1498.  
  1499.  
  1500.    n = Fwrite(fh,size,p);           /* write! */
  1501.    if (n >= 0 && n != size)         /* not all bytes written */
  1502.       n = -10;                      /* write fault */
  1503.  
  1504.    if (n < 0)                       /* error? */
  1505.       ms_error("can't write file %s (error code %d)\n",pfname,(int)n);
  1506.  
  1507. }     /* file_write() */
  1508.  
  1509.  
  1510.  
  1511.  
  1512. /***************************************************************************
  1513. *
  1514. *  write_symbol: write symbol to object file
  1515. *
  1516. *  Out:
  1517. *        symbol data (14 bytes) in **pp
  1518. *        new destination ^ in *pp
  1519. *
  1520. ***************************************************************************/
  1521.  
  1522. static void write_symbol(pp,pname,value)
  1523.  
  1524. char        **pp;                   /* ^ to ^ to destination buffer */
  1525. char        *pname;                 /* ^ to symbol name */
  1526. long        value;                  /* symbol value */
  1527. {     /* write_symbol() */
  1528.  
  1529.    char     *buf;                   /* ^ to output buffer */
  1530.    int      i;
  1531.  
  1532.  
  1533.    buf = *pp;                       /* get dst ^ */
  1534.    *pp += 14;                       /* advance ^ */
  1535.  
  1536.    for (i = 0; i < 14; buf[i++] = 0);  /* clear buffer */
  1537.    strcpy(buf,pname);                  /* put name in buffer */
  1538.    buf[8] = 0xa4;                      /* symbol type */
  1539.    *(long *)(buf + 10) = value;        /* value */
  1540.  
  1541. }     /* write_symbol() */
  1542.  
  1543.  
  1544.  
  1545.  
  1546. /*******************************************************************************
  1547. *
  1548. *  read_header: read resource header from resource file
  1549. *
  1550. *  The resource file header is read from the given (and opened) resource file
  1551. *  and written to *hd. The function supports short and long headers. It
  1552. *  returns always the long version of the resource header.
  1553. *
  1554. *  Note: the file pointer must be set to the beginning of the file.
  1555. *
  1556. *  Out:
  1557. *     resource header (always long version) in *hd
  1558. *     offset to add to relocation information in *off
  1559. *
  1560. *     file pointer set to location behind resource header
  1561. *
  1562. *******************************************************************************/
  1563.  
  1564. static void read_header(
  1565.  
  1566. int         fh,                     /* file handle */
  1567. char        *fspec,                 /* ^file specification */
  1568. LONGHDR     *hd,                    /* ^buffer for resource header */
  1569. long        *off)                   /* ^buffer for additional relocation */
  1570.                                     /*  offset */
  1571. {
  1572.  
  1573.    char     *src,*dst;              /* copy pointers for conversion */
  1574.    HDDES    *conv;                  /* ^conversion descriptors */
  1575.    ULONG    id;                     /* identification/version number */
  1576.    RHDR     shd;                    /* buffer for short file header */
  1577.  
  1578.  
  1579.    file_read(fh,fspec,sizeof(ULONG),&id);    /* read identification */
  1580.    id &= 0xffff0000UL;                       /* mask off version # */
  1581.    Fseek(0,fh,0);                            /* rewind file pointer */
  1582.  
  1583.    if (id == 0x30000UL)                      /* long format? */
  1584.       {
  1585.       *off = 0;                              /* no additional relocation */
  1586.       file_read(fh,fspec,sizeof(LONGHDR),hd);/* read complete header */
  1587.       }
  1588.    else                                      /* short header: */
  1589.       {
  1590.       *off = sizeof(LONGHDR) - sizeof(RHDR); /* relocation offset */
  1591.  
  1592.       if (id > 0x10000UL)                    /* illegal version #? */
  1593.          ms_error("%s: unknown version number (%d)\n",fspec,(int)(id >> 16));
  1594.  
  1595.       file_read(fh,fspec,sizeof(RHDR),&shd); /* read (short) file header */
  1596.  
  1597.       conv = convdes;                        /* ^conversion descriptors */
  1598.       src = (char *)&shd;                    /* ^source (short header) */
  1599.       dst = (char *)hd;                      /* ^destination (long header) */
  1600.  
  1601.       while (conv->srcoff >= 0)              /* while not end of table */
  1602.          {
  1603.          *(ULONG *)(dst + conv->dstoff) =                         /* write */
  1604.             (ULONG)*(UINT *)(src + conv->srcoff) +                /* read */
  1605.             (conv->oflag ? (sizeof(LONGHDR) - sizeof(RHDR)) : 0); /* size diff*/
  1606.  
  1607.          conv++;                             /* next entry */
  1608.          }
  1609.       }
  1610.  
  1611. }     /* read_header() */
  1612.  
  1613.  
  1614.  
  1615. /***************************************************************************
  1616. *
  1617. *  comp_rsc: compile resource
  1618. *
  1619. *  Out:
  1620. *        -
  1621. *
  1622. ***************************************************************************/
  1623.  
  1624. static void comp_rsc(pifile,pofile)
  1625.  
  1626. char        *pifile;                /* ^ to input filename */
  1627. char        *pofile;                /* ^ to output filename */
  1628. {
  1629.  
  1630.    char     *pd,                    /* ^ to data segment in object file */
  1631.             *pr,                    /* ^ to relocation data in object file */
  1632.             *name,                  /* ^resource name */
  1633.             *p;
  1634.    int      fh;                     /* file handle */
  1635.    long     reloff,                 /* additional relocation offset */
  1636.             osize;                  /* size of object file */
  1637.    ULONG    datasize,               /* size of resource data */
  1638.             nlen,                   /* length of rsc name (without 0-byte) */
  1639.             i,j;
  1640.    LONGHDR  rhd;                    /* resource header */
  1641.    OHDR     *po;                    /* ^ to object file buffer */
  1642.    OBJECT   *pobj;                  /* ^ to OBJECT array */
  1643.    RSCDES   *rd;                    /* ^resource descriptor */
  1644.  
  1645.  
  1646.       /*----- ALLOCATE BUFFER, READ RESOURCE -----*/
  1647.  
  1648.  
  1649.    fh = (int)Fopen(pifile,0);       /* open input file */
  1650.    if (fh < 0)                      /* error? abort */
  1651.       ms_error("can't open file %s (error code %d)\n",pifile,fh);
  1652.  
  1653.                                     /* read resource header */
  1654.    read_header(fh,pifile,&rhd,&reloff);
  1655.  
  1656.    p = strrchr(pifile,'\\');        /* find last path separator in filename */
  1657.    name = p ? p + 1 : pifile;       /* ^filename (wihtout path) */
  1658.    p = strrchr(name,'.');           /* find extension separator */
  1659.    nlen = p ? (ULONG)(p - name) : strlen(name); /* compute length of name */
  1660.  
  1661.                                     /* resource + descriptor + size + name */
  1662.    datasize = (ULONG)rhd.rssize + sizeof(RSCDES) + sizeof(ULONG) + nlen + 1;
  1663.    if (datasize & 1)                /* odd? */
  1664.       datasize++;                   /* make it even */
  1665.  
  1666.                                     /* allocate buffer */
  1667.    po = malloc(osize = sizeof(OHDR) + datasize * 2 + 2 * 14);
  1668.    if (!po)                         /* memory full? abort */
  1669.       ms_mfull();
  1670.  
  1671.    pd = (char *)(po + 1);           /* ^ to data segment */
  1672.    p = pd + datasize;               /* ^ to symbol table */
  1673.    pr = p + 2 * 14;                 /* ^ to relocation data */
  1674.  
  1675.    *(LONGHDR *)pd = rhd;            /* write resource header to buffer */
  1676.                                     /* read resource data */
  1677.    file_read(fh,pifile,rhd.rssize - sizeof(LONGHDR),pd + sizeof(LONGHDR));
  1678.    Fclose(fh);                      /* close input file */
  1679.  
  1680.  
  1681.  
  1682.       /*----- CREATE SYMBOL TABLE -----*/
  1683.  
  1684.  
  1685.    write_symbol(&p,"_rdesar",       /* resource descriptor array */
  1686.                 rhd.rssize);
  1687.    write_symbol(&p,"_numrsc",       /* size of resource descriptor array */
  1688.                 rhd.rssize + sizeof(RSCDES));
  1689.  
  1690.  
  1691.       /*----- INITIALIZE RESOURCE DESCRIPTOR ARRAY -----*/
  1692.  
  1693.  
  1694.                                     /* init relocation data */
  1695.    for (i = datasize; i; i--,*p++ = 0);
  1696.  
  1697.    rd = (RSCDES *)(pd + rhd.rssize);   /* ^resource descriptor */
  1698.  
  1699.                                     /* offset to name */
  1700.    rd->name    = rhd.rssize + sizeof(RSCDES) + sizeof(ULONG);
  1701.    rd->RSCLHDR = 0;                 /* offset to resource header */
  1702.    rd->object  = rhd.object;        /* structure offsets */
  1703.    rd->tedinfo = rhd.tedinfo;
  1704.    rd->iconblk = rhd.iconblk;
  1705.    rd->bitblk  = rhd.bitblk;
  1706.    rd->trindex = rhd.trindex;
  1707.    rd->frstr   = rhd.frstr;
  1708.    rd->frimg   = rhd.frimg;
  1709.  
  1710.    p = pr + rhd.rssize;             /* ^reloc info for resource descriptor */
  1711.  
  1712.                                     /* set relocation information */
  1713.    *(long *)(p + SOFF(RSCDES,name)) = RELINFO;
  1714.    *(long *)(p + SOFF(RSCDES,RSCLHDR)) = RELINFO;
  1715.    *(long *)(p + SOFF(RSCDES,object)) = RELINFO;
  1716.    *(long *)(p + SOFF(RSCDES,tedinfo)) = RELINFO;
  1717.    *(long *)(p + SOFF(RSCDES,iconblk)) = RELINFO;
  1718.    *(long *)(p + SOFF(RSCDES,bitblk)) = RELINFO;
  1719.    *(long *)(p + SOFF(RSCDES,trindex)) = RELINFO;
  1720.    *(long *)(p + SOFF(RSCDES,frstr)) = RELINFO;
  1721.    *(long *)(p + SOFF(RSCDES,frimg)) = RELINFO;
  1722.  
  1723.    p = (char *)(rd + 1);            /* skip resource descriptor */
  1724.    *((ULONG *)p)++ = 1;             /* set size (always 1 entry in array) */
  1725.  
  1726.    strncpy(p,name,nlen);            /* resource name */
  1727.    p[nlen++] = '\0';                /* terminate */
  1728.    if (nlen & 1)                    /* odd size? */
  1729.       p[nlen] = '\0';               /* set gap byte */
  1730.  
  1731.    strupr(p);                       /* convert to upper case */
  1732.  
  1733.  
  1734.       /*----- SET OBJECT FILE HEADER -----*/
  1735.  
  1736.  
  1737.                                     /* init object file header */
  1738.    po->magic = 0x601a;              /* magic word */
  1739.    po->text_size = 0;               /* size of text segment */
  1740.    po->data_size = datasize;        /* size of data segment */
  1741.    po->bss_size = 0;                /* size of BSS */
  1742.    po->symb_size = 2 * 14;          /* size of symbol table */
  1743.    po->resvd1 = po->resvd2 = 0;     /* reserved */
  1744.    po->resvd3 = 0;
  1745.  
  1746.  
  1747.       /*----- BUILD RELOCATION INFORMATION -----*/
  1748.  
  1749.  
  1750.                                     /* ^ to first OBJECT */
  1751.    pobj = (OBJECT *)(pd + rhd.object);
  1752.                                     /* init offset to current ob_spec */
  1753.    j = rhd.object + SOFF(OBJECT,ob_spec);
  1754.  
  1755.                                     /* relocate OBJECTs */
  1756.    for (i = rhd.nobs; i; i--, j += sizeof(OBJECT), pobj++)
  1757.       switch (pobj->ob_type & 0xff) /* which type? */
  1758.          {
  1759.          case G_BOX:                /* non-relocatable objects? */
  1760.          case G_IBOX:
  1761.          case G_BOXCHAR:
  1762.             break;                  /* then do nothing */
  1763.  
  1764.          default:                   /* else relocate */
  1765.             *(long *)(pr + j) = RELINFO;
  1766.             *(long *)(pd + j) += reloff;
  1767.          }
  1768.  
  1769.  
  1770.  
  1771.                                     /* relocate TEDINFOs */
  1772.    for (i = rhd.nted, j = rhd.tedinfo; i; i--, j += sizeof(TEDINFO))
  1773.       {
  1774.       *(long *)(pr + SOFF(TEDINFO,te_ptext) + j) =
  1775.       *(long *)(pr + SOFF(TEDINFO,te_ptmplt) + j) =
  1776.       *(long *)(pr + SOFF(TEDINFO,te_pvalid) + j) = RELINFO;
  1777.  
  1778.       *(long *)(pd + SOFF(TEDINFO,te_ptext) + j) += reloff;
  1779.       *(long *)(pd + SOFF(TEDINFO,te_ptmplt) + j) += reloff;
  1780.       *(long *)(pd + SOFF(TEDINFO,te_pvalid) + j) += reloff;
  1781.       }
  1782.  
  1783.  
  1784.  
  1785.                                     /* relocate ICONBLKs */
  1786.    for (i = rhd.nib, j = rhd.iconblk; i; i--, j += sizeof(ICONBLK))
  1787.       {
  1788.       *(long *)(pr + j + SOFF(ICONBLK,ib_pmask)) =
  1789.       *(long *)(pr + j + SOFF(ICONBLK,ib_pdata)) =
  1790.       *(long *)(pr + j + SOFF(ICONBLK,ib_ptext)) = RELINFO;
  1791.  
  1792.       *(long *)(pd + j + SOFF(ICONBLK,ib_pmask)) += reloff;
  1793.       *(long *)(pd + j + SOFF(ICONBLK,ib_pdata)) += reloff;
  1794.       *(long *)(pd + j + SOFF(ICONBLK,ib_ptext)) += reloff;
  1795.       }
  1796.  
  1797.  
  1798.                                     /* relocate BITBLKs */
  1799.    for (i = rhd.nbb, j = rhd.bitblk; i; i--, j += sizeof(BITBLK))
  1800.       {
  1801.       *(long *)(pr + j + SOFF(BITBLK,bi_pdata)) = RELINFO;
  1802.       *(long *)(pd + j + SOFF(BITBLK,bi_pdata)) += reloff;
  1803.       }
  1804.  
  1805.  
  1806.                                     /* relocate free string offset table */
  1807.    for (i = rhd.nstring, j = rhd.frstr; i; i--, j += sizeof(long))
  1808.       {
  1809.       *(long *)(pr + j) = RELINFO;
  1810.       *(long *)(pd + j) += reloff;
  1811.       }
  1812.  
  1813.  
  1814.                                     /* relocate free image offset table */
  1815.    for (i = rhd.nimages, j = rhd.frimg; i; i--, j += sizeof(long))
  1816.       {
  1817.       *(long *)(pr + j) = RELINFO;
  1818.       *(long *)(pd + j) += reloff;
  1819.       }
  1820.  
  1821.  
  1822.                                     /* relocate tree index table */
  1823.    for (i = rhd.ntree, j = rhd.trindex; i; i--, j += sizeof(long))
  1824.       {
  1825.       *(long *)(pr + j) = RELINFO;
  1826.       *(long *)(pd + j) += reloff;
  1827.       }
  1828.  
  1829.  
  1830.       /*----- WRITE COMPILED RESOURCE TO DISK -----*/
  1831.  
  1832.  
  1833.    fh = (int)Fcreate(pofile,0);     /* create output file */
  1834.  
  1835.    if (fh < 0)                      /* error? abort */
  1836.       ms_error("can't create file %s (error code %d)\n",pofile,fh);
  1837.  
  1838.    file_write(fh,pofile,osize,po);  /* write file */
  1839.    Fclose(fh);                      /* close it */
  1840.  
  1841. }     /* comp_rsc() */
  1842.  
  1843.  
  1844. /*******************************************************************************
  1845. *                                                                              *
  1846. *                                GLOBAL FUNCTIONS                              *
  1847. *                                                                              *
  1848. *******************************************************************************/
  1849.  
  1850. /*START*/
  1851. /***************************************************************************
  1852. *
  1853. *  main: application entry point
  1854. *
  1855. *  Out:
  1856. *     application exit status:
  1857. *     0                 ok
  1858. *     !=0               error
  1859. *
  1860. ***************************************************************************/
  1861.  
  1862. int main(argc,argv)
  1863.  
  1864. int         argc;
  1865. char        *argv[];
  1866. {     /* main() */
  1867. /*END*/
  1868.  
  1869.    char     ofile[MAX_FSIZE],       /* buffer for input filename */
  1870.             *p;
  1871.  
  1872.  
  1873.    if (argc < 2 || argc > 3)        /* wrong # of arguments? */
  1874.       {
  1875.       printf(
  1876.  
  1877.       "GEM RESOURCE COMPILER           Release %d   %02x.%02x.%02x\n"
  1878.       "Written by Harald Siegmund      Copyright (c) 1990-%x\n"
  1879.       "\n"
  1880.       "usage: rcom resource_file [object_file]\n"
  1881.       "\n"
  1882.       "       default for object_file: resource filename with extension .o\n"
  1883.  
  1884.       , RELEASE, _DAY, _MONTH, _YEAR & 0xff, _YEAR);
  1885.  
  1886.       return 1;
  1887.       }
  1888.  
  1889.    if (argc == 2)                   /* no output filename? */
  1890.       {
  1891.       strcpy(ofile,argv[1]);        /* copy input filename */
  1892.       p = strrchr(ofile,'.');       /* search extension */
  1893.       if (p > strrchr(ofile,'\\'))  /* if not extension of folder */
  1894.          *p = '\0';                 /* then cut it */
  1895.       strcat(ofile,".o");           /* add object file extension */
  1896.       }
  1897.    else strcpy(ofile,argv[2]);      /* copy output filename to buffer */
  1898.  
  1899.    comp_rsc(argv[1],ofile);         /* compile */
  1900.  
  1901.    return 0;                        /* that's it */
  1902.  
  1903. }     /* main() */
  1904.  
  1905.  
  1906. /*EOF*/
  1907. /*TAB=3***CHAR={ATARI}**********************************************************
  1908. *
  1909. *  Project name : GEM RESOURCE LINKER
  1910. *  Module name  : Main module
  1911. *  Symbol prefix: -
  1912. *
  1913. *  Author       : Harald Siegmund (HS)
  1914. *  Co-Authors   : -
  1915. *  Write access : HS
  1916. *
  1917. *  Notes        : -
  1918. *-------------------------------------------------------------------------------
  1919. *  Things to do : -
  1920. *
  1921. *-------------------------------------------------------------------------------
  1922. *  History:
  1923. *
  1924. *  1994:
  1925. *     Mar 10: introduced
  1926. *     Apr 19: debugging: chained list of resource descriptor was corrupted if
  1927. *              more than two resources were linked
  1928. *
  1929. *******************************************************************************/
  1930. /*KEY _NAME="GEM resource linker" */
  1931. /*KEY &RELEASE */
  1932. /*KEY _DAY=0x */
  1933. /*KEY _MONTH=0x */
  1934. /*KEY _YEAR=0x */
  1935. /*END*/
  1936.  
  1937. /*******************************************************************************
  1938. *                                                                              *
  1939. *                                   INCLUDES                                   *
  1940. *                                                                              *
  1941. *******************************************************************************/
  1942.  
  1943. #include <stdio.h>
  1944. #include <stdlib.h>
  1945. #include <stdarg.h>
  1946. #include <string.h>
  1947. #include <tos.h>
  1948. /*KEY _END */
  1949.  
  1950.  
  1951. /*******************************************************************************
  1952. *                                                                              *
  1953. *                                    MACROS                                    *
  1954. *                                                                              *
  1955. *******************************************************************************/
  1956.  
  1957. #ifndef RELEASE                     /* not translated with Make Control? */
  1958. #   define RELEASE   2              /* release number */
  1959. #   define _DAY      0x19           /* release date (BCD) */
  1960. #   define _MONTH    0x04
  1961. #   define _YEAR     0x1994
  1962. #endif
  1963.  
  1964.  
  1965. #define MS_ERRDEV stdaux            /* device for warnings and errors */
  1966.  
  1967.  
  1968. #define MAX_FSIZE    256            /* max size of filespec incl. terminator */
  1969. #define RELINFO      0x00050001L    /* 5:long relocation, 1:data segment */
  1970.  
  1971.  
  1972. /* this macro calculates the offset of a structure element to the start of
  1973.    the structure in bytes */
  1974.  
  1975. #define SOFF(type,label) ((ULONG)((char *)(&((type *)NULL)->label) - (char *)NULL))
  1976.  
  1977.  
  1978. #define TRUE      1                 /* boolean */
  1979. #define FALSE     0
  1980.  
  1981.  
  1982. /*******************************************************************************
  1983. *                                                                              *
  1984. *                               TYPE DEFINITIONS                               *
  1985. *                                                                              *
  1986. *******************************************************************************/
  1987.  
  1988. typedef unsigned int UINT;          /* shortcuts */
  1989. typedef unsigned long ULONG;
  1990.  
  1991.  
  1992. typedef struct                      /* resource file header (long format) */
  1993.    {
  1994.    ULONG    vrsn;                   /* version # */
  1995.    ULONG    object;                 /* offset to first OBJECT */
  1996.    ULONG    tedinfo;                /* offset to first TEDINFO */
  1997.    ULONG    iconblk;                /* offset to first ICONBLK */
  1998.    ULONG    bitblk;                 /* offset to first BITBLK */
  1999.    ULONG    frstr;                  /* offset to ULONG array of offsets to */
  2000.                                     /*  free strings */
  2001.    ULONG    string;                 /* offset to first string */
  2002.    ULONG    imdata;                 /* offset to base of image data */
  2003.    ULONG    frimg;                  /* offset to ULONG array of offsets to */
  2004.                                     /*  free images */
  2005.    ULONG    trindex;                /* offset to ULONG array of offsets to */
  2006.                                     /*  first OBJECT of trees */
  2007.    ULONG    nobs;                   /* # of OBJECTs */
  2008.    ULONG    ntree;                  /* # of trees */
  2009.    ULONG    nted;                   /* # of TEDINFOs */
  2010.    ULONG    nib;                    /* # of ICONBLKs */
  2011.    ULONG    nbb;                    /* # of BITBLKs */
  2012.    ULONG    nstring;                /* # of free strings */
  2013.    ULONG    nimages;                /* # of free images */
  2014.    ULONG    rssize;                 /* size of resource file */
  2015.    } LONGHDR;
  2016.  
  2017. /* any offset 0: data not available */
  2018.  
  2019.  
  2020. typedef struct                      /* resource descriptor: */
  2021.    {
  2022.    ULONG    name;                   /* offset to resource name */
  2023.    ULONG    RSCLHDR;                /* offset to resource header */
  2024.    ULONG    object;                 /* offset to OBJECT array */
  2025.    ULONG    tedinfo;                /* offset to TEDINFO array */
  2026.    ULONG    iconblk;                /* offset to ICONBLK array */
  2027.    ULONG    bitblk;                 /* offset to BITBLK array */
  2028.    ULONG    trindex;                /* offset to tree pointer array */
  2029.    ULONG    frstr;                  /* offset to free string pointer array */
  2030.    ULONG    frimg;                  /* offset to free image pointer array */
  2031.    } RSCDES;
  2032.  
  2033. /* if RSCDES does contain anything with a size != sizeof(ULONG) then the
  2034.    relocator at the end of link_rsc() will have to be adjusted */
  2035.  
  2036.  
  2037. typedef struct                      /* object file header */
  2038.    {
  2039.    int      magic;                  /* magic word */
  2040.    ULONG    text_size;              /* size of text segment */
  2041.    ULONG    data_size;              /* size of data segment */
  2042.    ULONG    bss_size;               /* size of bss segment */
  2043.    ULONG    symb_size;              /* size of symbol table */
  2044.    long     resvd1;                 /* reserved */
  2045.    long     resvd2;                 /* reserved */
  2046.    int      resvd3;                 /* reserved */
  2047.    } OHDR;
  2048.  
  2049.  
  2050. struct RDLIST                       /* chained resource descriptor array list */
  2051.    {
  2052.    ULONG    nd;                     /* # of resource descriptors */
  2053.    RSCDES   *pd;                    /* ^start of descriptor array */
  2054.    struct RDLIST *next;             /* ^next entry in chain (or NULL) */
  2055.    };
  2056.  
  2057.  
  2058. /*******************************************************************************
  2059. *                                                                              *
  2060. *                                LOCAL PROTOTYPES                              *
  2061. *                                                                              *
  2062. *******************************************************************************/
  2063.  
  2064.    /* display error message and abort process */
  2065. static void ms_error(char *cs,...);
  2066.  
  2067.    /* display error message "out of memory" and abort process */
  2068. static void ms_mfull(void);
  2069.  
  2070.    /* read bytes from file */
  2071. static void file_read(int fh,char *pfname,long size,void *p);
  2072.  
  2073.    /* write bytes to file */
  2074. static void file_write(int fh,char *pfname,long size,void *p);
  2075.  
  2076.    /* write symbol to object file */
  2077. static void write_symbol(int fh,char *fspec,char *pname,long value);
  2078.  
  2079.    /* find symbol */
  2080. static ULONG find_symbol(char *name,char *fspec,ULONG symsize,char *stab);
  2081.  
  2082.    /* delete target file (in case of an error) */
  2083. static void deltarget(void);
  2084.  
  2085.    /* link resources */
  2086. static void link_rsc(char *target,int nrsc,char *rsc[]);
  2087.  
  2088.  
  2089. /*******************************************************************************
  2090. *                                                                              *
  2091. *                             UNINITIALIZED STATICS                            *
  2092. *                                                                              *
  2093. *******************************************************************************/
  2094.  
  2095. static char *target_filespec;       /* ^file specification of target file */
  2096.                                     /* (NULL = none) */
  2097. static int target_handle;           /* handle of <target_filespec> */
  2098.  
  2099.  
  2100. /*******************************************************************************
  2101. *                                                                              *
  2102. *                                 LOCAL FUNCTIONS                              *
  2103. *                                                                              *
  2104. *******************************************************************************/
  2105.  
  2106. /*******************************************************************************
  2107. *
  2108. *  ms_error: display error message and abort process
  2109. *
  2110. *  A message is printed in the form:
  2111. *  rlink: error: <cs>...
  2112. *
  2113. *  Then all open files are closed, allocated memory blocks are freed and the
  2114. *  process is terminated.
  2115. *
  2116. *  Out:
  2117. *     -
  2118. *
  2119. *******************************************************************************/
  2120.  
  2121. static void ms_error(
  2122.  
  2123. char        *cs,                    /* ^ to printf-like control string */
  2124.             ...)                    /* any parameters for printf() */
  2125. {
  2126.  
  2127.    va_list  arg;                    /* ^ to argument list for vprintf() */
  2128.  
  2129.  
  2130.                                     /* display message header */
  2131.    fprintf(MS_ERRDEV,"\n\x07rlink: ERROR: ");
  2132.    va_start(arg,cs);                /* init argument ^ */
  2133.    vfprintf(MS_ERRDEV,cs,arg);      /* print ... */
  2134.    va_end(arg);                     /* finished */
  2135.  
  2136.    exit(1);                         /* terminate */
  2137.  
  2138. }     /* ms_error() */
  2139.  
  2140.  
  2141. /*******************************************************************************
  2142. *
  2143. *  ms_mfull: display error message "out of memory" and abort process
  2144. *
  2145. *  The following message is printed:
  2146. *  rlink: error: out of memory
  2147. *
  2148. *  Then all open files are closed, allocated memory blocks are freed and the
  2149. *  process is terminated.
  2150. *
  2151. *  Out:
  2152. *     -
  2153. *
  2154. *******************************************************************************/
  2155.  
  2156. static void ms_mfull(void)
  2157. {
  2158.  
  2159.    ms_error("out of memory\n");
  2160.  
  2161. }     /* ms_mfull() */
  2162.  
  2163.  
  2164. /***************************************************************************
  2165. *
  2166. *  file_read: read data from file
  2167. *
  2168. *  Out:
  2169. *        -
  2170. *
  2171. ***************************************************************************/
  2172.  
  2173. static void file_read(fh,pfname,size,p)
  2174.  
  2175. int         fh;                     /* file handle */
  2176. char        *pfname;                /* ^ to filename */
  2177. long        size;                   /* # of bytes to reade */
  2178. void        *p;                     /* ^ to buffer */
  2179. {
  2180.  
  2181.    long     n;                      /* # of read bytes/status */
  2182.  
  2183.  
  2184.    n = Fread(fh,size,p);            /* read! */
  2185.    if (n >= 0 && n != size)         /* not all bytes read? */
  2186.       n = -11;                      /* read fault */
  2187.  
  2188.    if (n < 0)                       /* error? */
  2189.       ms_error("can't read file %s (error code %d)\n",pfname,(int)n);
  2190.  
  2191. }     /* file_read() */
  2192.  
  2193.  
  2194.  
  2195.  
  2196. /***************************************************************************
  2197. *
  2198. *  file_write: write data into file
  2199. *
  2200. *  Out:
  2201. *        -
  2202. *
  2203. ***************************************************************************/
  2204.  
  2205. static void file_write(fh,pfname,size,p)
  2206.  
  2207. int         fh;                     /* file handle */
  2208. char        *pfname;                /* ^ to filename */
  2209. long        size;                   /* # of bytes to write */
  2210. void        *p;                     /* ^ to data to write */
  2211. {
  2212.  
  2213.    long     n;                      /* # of written bytes/status */
  2214.  
  2215.  
  2216.    n = Fwrite(fh,size,p);           /* write! */
  2217.    if (n >= 0 && n != size)         /* not all bytes written */
  2218.       n = -10;                      /* write fault */
  2219.  
  2220.    if (n < 0)                       /* error? */
  2221.       ms_error("can't write file %s (error code %d)\n",pfname,(int)n);
  2222.  
  2223. }     /* file_write() */
  2224.  
  2225.  
  2226. /***************************************************************************
  2227. *
  2228. *  write_symbol: write symbol to object file
  2229. *
  2230. *  Out:
  2231. *     -
  2232. *
  2233. ***************************************************************************/
  2234.  
  2235. static void write_symbol(
  2236.  
  2237. int         fh,                     /* file handle */
  2238. char        *fspec,                 /* ^filespec */
  2239. char        *pname,                 /* symbol name */
  2240. long        value)                  /* symbol value */
  2241. {
  2242.  
  2243.    char     buf[14];                /* output buffer */
  2244.    int      i;
  2245.  
  2246.  
  2247.    for (i = 0; i < 14; buf[i++] = 0);     /* clear buffer */
  2248.    strcpy(buf,pname);                     /* put name in buffer */
  2249.    buf[8] = 0xa4;                         /* symbol type */
  2250.    *(long *)(buf + 10) = value;           /* value */
  2251.  
  2252.    file_write(fh,fspec,sizeof(buf),buf);  /* write to object file */
  2253.  
  2254. }     /* write_symbol() */
  2255.  
  2256.  
  2257. /***************************************************************************
  2258. *
  2259. *  find_symbol: find symbol
  2260. *
  2261. *  Out:
  2262. *     symbol's value
  2263. *
  2264. ***************************************************************************/
  2265.  
  2266. static ULONG find_symbol(
  2267.  
  2268. char        *name,                  /* ^name of symbol to find */
  2269. char        *fspec,                 /* ^filespec of object file */
  2270. ULONG       symsize,                /* size of symbol table in bytes */
  2271. char        *stab)                  /* ^base of symbol table */
  2272. {
  2273.  
  2274.    size_t   len;                    /* length of symbol name */
  2275.  
  2276.  
  2277.    symsize /= 14;                   /* # of symbols */
  2278.    len = strlen(name);              /* length of name */
  2279.  
  2280.    while (symsize--)                /* while not end of table */
  2281.       {
  2282.       if (!strncmp(stab,name,len))        /* name is equal? */
  2283.          if (len == 8 || !stab[len])      /* and terminated correctly? */
  2284.             return *(ULONG *)(stab + 10); /* then get offset and return */
  2285.  
  2286.       stab += 14;                   /* skip */
  2287.       }
  2288.  
  2289.                                     /* not found: error */
  2290.    ms_error("undefined symbol \'%s\' in file %s\n",name,fspec);
  2291.  
  2292.    return 0;                        /* supress compiler warning */
  2293.  
  2294. }     /* find_symbol() */
  2295.  
  2296.  
  2297. /*******************************************************************************
  2298. *
  2299. *  deltarget: delete target file (in case of an error)
  2300. *
  2301. *  This is an atexit-handler which deletes the file <target_filespec> (if
  2302. *  that pointer isn't NULL), which is assumed to be opened (with the handle
  2303. *  <target_handle>).
  2304. *
  2305. *  Out:
  2306. *     -
  2307. *
  2308. *******************************************************************************/
  2309.  
  2310. static void deltarget(void)
  2311. {
  2312.  
  2313.    if (target_filespec)             /* filespec exists? close and delete file */
  2314.       {
  2315.       (void)Fclose(target_handle);
  2316.       (void)Fdelete(target_filespec);
  2317.       }
  2318.  
  2319. }     /* deltarget() */
  2320.  
  2321.  
  2322. /*******************************************************************************
  2323. *
  2324. *  link_rsc: link resources
  2325. *
  2326. *  Out:
  2327. *     -
  2328. *
  2329. *******************************************************************************/
  2330.  
  2331. static void link_rsc(
  2332.  
  2333. char        *target,                /* ^target filespec */
  2334. int         nrsc,                   /* # of input filespecs (> 0) */
  2335. char        *rsc[])                 /* input filespec array */
  2336. {
  2337.  
  2338.    char     *p,*p2;                 /* temp pointers */
  2339.    int      t_fh,                   /* target file handle */
  2340.             fh,                     /* source file handle */
  2341.             cnt;                    /* resource counter */
  2342.    ULONG    reloc,                  /* offset into relocation table */
  2343.             total_nd,               /* total # of resource descriptors */
  2344.             size,                   /* size of resource data */
  2345.             *rofftab;               /* ^reloc info offset table */
  2346.    OHDR     hd,                     /* header of object file to create */
  2347.             rhd;                    /* header of loaded object file */
  2348.    struct RDLIST *d_first,          /* ^first entry of chained descriptor list*/
  2349.                  *d_cur,            /* ^current entry */
  2350.                  *d_next;           /* ^next entry */
  2351.  
  2352.  
  2353.       /*----- SET OBJECT FILE HEADER -----*/
  2354.  
  2355.  
  2356.    hd.magic = 0x601a;               /* magic */
  2357.    hd.text_size =                   /* size of text segment */
  2358.    hd.data_size =                   /* size of data segment */
  2359.    hd.bss_size = 0;                 /* size of block storage segemnt */
  2360.    hd.symb_size = 14 * 2;           /* size of symbol table */
  2361.    hd.resvd1 =                      /* reserved */
  2362.    hd.resvd2 = 0;
  2363.    hd.resvd3 = 0;                   /* reserved */
  2364.  
  2365.  
  2366.       /*----- CREATE TARGET FILE -----*/
  2367.  
  2368.  
  2369.    t_fh = (int)Fcreate(target,0);   /* create target file */
  2370.    if (t_fh < 0)                    /* error? abort */
  2371.       ms_error("can't create file %s (error code %d)\n",target,t_fh);
  2372.  
  2373.    target_handle = t_fh;            /* set parameters for atexit-handler */
  2374.    target_filespec = target;
  2375.  
  2376.    (void)atexit(deltarget);         /* in case of an error: delete target */
  2377.  
  2378.    file_write(t_fh,target,sizeof(OHDR),&hd); /* write header to file */
  2379.  
  2380.  
  2381.       /*----- READ, ANALYSE AND RELOCATE COMPILED RESOURCES -----*/
  2382.  
  2383.  
  2384.    rofftab = malloc(sizeof(ULONG) * nrsc);   /* allocate offset table */
  2385.    if (!rofftab)                             /* out of memory? abort */
  2386.       ms_mfull();
  2387.  
  2388.    total_nd = 0;                             /* init # of resource descriptors*/
  2389.    d_first = d_cur = NULL;                   /* list is empty */
  2390.  
  2391.    for (cnt = 0; cnt < nrsc; cnt++)
  2392.       {
  2393.       fh = (int)Fopen(rsc[cnt],0);           /* open resource file */
  2394.       if (fh < 0)                            /* error? abort */
  2395.          ms_error("can't open file %s (error code %d)\n",rsc[cnt],fh);
  2396.  
  2397.                                              /* read header */
  2398.       file_read(fh,rsc[cnt],sizeof(OHDR),&rhd);
  2399.  
  2400.       if (rhd.magic != 0x601a ||             /* format check */
  2401.           rhd.text_size ||
  2402.           !rhd.data_size ||
  2403.           rhd.bss_size ||
  2404.           rhd.symb_size != 14 * 2)
  2405.          ms_error("file %s is no valid compiled resource\n",rsc[cnt]);
  2406.  
  2407.                                              /* offset to relocation table */
  2408.       rofftab[cnt] = sizeof(OHDR) + rhd.data_size + rhd.symb_size;
  2409.  
  2410.                                              /* buffer for resource */
  2411.       p = malloc(size = rhd.data_size * 2 + rhd.symb_size);
  2412.       if (!p)                                /* out of memory? abort */
  2413.          ms_mfull();
  2414.  
  2415.       file_read(fh,rsc[cnt],size,p);         /* read resource */
  2416.       (void)Fclose(fh);                      /* close file */
  2417.  
  2418.  
  2419.       if (hd.data_size)                      /* relocation required? */
  2420.          {
  2421.          p2 = p + rhd.data_size + rhd.symb_size;   /* ^relocation table */
  2422.  
  2423.          for (reloc = 0; reloc < rhd.data_size; reloc += 2, p2 += 2)
  2424.             if (*(int *)p2)                  /* relocate this location? */
  2425.                {                             /* add offset */
  2426.                *(ULONG *)(p + reloc) += hd.data_size;
  2427.                reloc += 2;                   /* always a long relocation, */
  2428.                p2 += 2;                      /*  so skip next word */
  2429.                }
  2430.          }
  2431.  
  2432.  
  2433.       p2 = p + rhd.data_size;                /* ^symbol table */
  2434.  
  2435.       d_next = malloc(sizeof(struct RDLIST));   /* allocate new list entry */
  2436.       if (!d_next)
  2437.          ms_mfull();
  2438.  
  2439.       d_next->next = NULL;                   /* init chain pointer */
  2440.  
  2441.       d_next->nd = *(ULONG *)(p +            /* locate counter and get it */
  2442.                    find_symbol("_numrsc",rsc[cnt],rhd.symb_size,p2));
  2443.  
  2444.       total_nd += d_next->nd;                /* sum */
  2445.  
  2446.                                              /* allocate buffer for array */
  2447.       d_next->pd = malloc(size = sizeof(RSCDES) * d_next->nd);
  2448.       if (!d_next->pd)
  2449.          ms_mfull();
  2450.  
  2451.       memmove(d_next->pd,                    /* copy descriptor array */
  2452.               p + find_symbol("_rdesar",rsc[cnt],rhd.symb_size,p2),
  2453.               size);
  2454.  
  2455.       if (!d_first)                          /* append to chained list */
  2456.          d_first = d_cur = d_next;
  2457.       else
  2458.          {
  2459.          d_cur->next = d_next;
  2460.          d_cur = d_next;
  2461.          }
  2462.  
  2463.                                              /* write data segment to target */
  2464.       file_write(t_fh,target,rhd.data_size,p);
  2465.  
  2466.       free(p);                               /* delete loaded resource */
  2467.  
  2468.       hd.data_size += rhd.data_size;         /* sum of all data segments */
  2469.  
  2470.       }     /* for (cnt = 0; ...) */
  2471.  
  2472.  
  2473.       /*----- WRITE MERGED RESOURCE DESCRIPTORS TO TARGET FILE -----*/
  2474.  
  2475.  
  2476.    d_cur = d_first;                 /* ^first entry of chained list */
  2477.  
  2478.    while (d_cur)                    /* while not end of list */
  2479.       {                             /* write descriptors */
  2480.       file_write(t_fh,target,sizeof(RSCDES) * d_cur->nd,d_cur->pd);
  2481.       d_next = d_cur->next;         /* ^next entry */
  2482.  
  2483.       free(d_cur->pd);              /* delete descriptor array */
  2484.       free(d_cur);                  /* delete chain structure */
  2485.  
  2486.       d_cur = d_next;               /* next entry */
  2487.       }
  2488.  
  2489.                                     /* write total # of descriptors */
  2490.    file_write(t_fh,target,sizeof(ULONG),&total_nd);
  2491.  
  2492.  
  2493.       /*----- CREATE ACCESS SYMBOLS -----*/
  2494.  
  2495.  
  2496.                                     /* resource descriptor array */
  2497.    write_symbol(t_fh,target,"_rdesar",hd.data_size);
  2498.  
  2499.                                     /* adjust data segment size */
  2500.    hd.data_size += sizeof(RSCDES) * total_nd;
  2501.  
  2502.                                     /* array size */
  2503.    write_symbol(t_fh,target,"_numrsc",hd.data_size);
  2504.  
  2505.    hd.data_size += sizeof(ULONG);   /* final data segment size */
  2506.  
  2507.  
  2508.       /*----- WRITE RELOCATION INFORMATION TO TARGET FILE -----*/
  2509.  
  2510.  
  2511.    for (cnt = 0; cnt < nrsc; cnt++)
  2512.       {
  2513.       fh = (int)Fopen(rsc[cnt],0);           /* open resource file */
  2514.       if (fh < 0)                            /* error? abort */
  2515.          ms_error("can't open file %s (error code %d)\n",rsc[cnt],fh);
  2516.  
  2517.                                              /* read header */
  2518.       file_read(fh,rsc[cnt],sizeof(OHDR),&rhd);
  2519.  
  2520.       if (Fseek(rofftab[cnt],fh,0) < 0)      /* start of reloc table */
  2521.          ms_error("file %s: seek error\n",rsc[cnt]);
  2522.  
  2523.       p = malloc(rhd.data_size);             /* buffer for reloc table */
  2524.       if (!p)
  2525.          ms_mfull();
  2526.  
  2527.       file_read(fh,rsc[cnt],rhd.data_size,p);/* read reloc table */
  2528.       (void)Fclose(fh);                      /* close file */
  2529.  
  2530.       file_write(t_fh,target,rhd.data_size,p);  /* write table to target file */
  2531.       free(p);                               /* delete buffer */
  2532.  
  2533.       }     /* for (cnt = 0; ...) */
  2534.  
  2535.    free(rofftab);                   /* delete offset table */
  2536.  
  2537.  
  2538.       /*----- CREATE RELOCATION INFORMATION OF MERGED DESCRIPTOR ARRAY -----*/
  2539.  
  2540.  
  2541.    p = p2 = malloc(size = sizeof(RSCDES) * total_nd + sizeof(ULONG));
  2542.    if (!p)
  2543.       ms_mfull();
  2544.  
  2545.    memset(p,0,size);                /* init with zeroes */
  2546.  
  2547.    reloc = size / sizeof(ULONG) - 1;/* # of longwords to relocate */
  2548.  
  2549.    while (reloc--)                  /* build relocation information */
  2550.       *((ULONG *)p2)++ = RELINFO;
  2551.  
  2552.    file_write(t_fh,target,size,p);  /* write it to target file */
  2553.  
  2554.  
  2555.       /*----- UPDATE FILE HEADER OF TARGET FILE -----*/
  2556.  
  2557.  
  2558.    if (Fseek(0,t_fh,0) < 0)         /* rewind */
  2559.       ms_error("file %s: seek error\n",target);
  2560.  
  2561.    file_write(t_fh,target,sizeof(OHDR),&hd);
  2562.    Fclose(t_fh);                    /* close target file */
  2563.  
  2564.    target_filespec = NULL;          /* disable error handler */
  2565.  
  2566. }     /* link_rsc() */
  2567.  
  2568.  
  2569. /*******************************************************************************
  2570. *                                                                              *
  2571. *                                GLOBAL FUNCTIONS                              *
  2572. *                                                                              *
  2573. *******************************************************************************/
  2574.  
  2575. /*START*/
  2576. /***************************************************************************
  2577. *
  2578. *  main: application entry point
  2579. *
  2580. *  Out:
  2581. *     application exit status:
  2582. *     0                 ok
  2583. *     !=0               error
  2584. *
  2585. ***************************************************************************/
  2586.  
  2587. int main(argc,argv)
  2588.  
  2589. int         argc;
  2590. char        *argv[];
  2591. {
  2592. /*END*/
  2593.  
  2594.    if (argc < 3)                    /* wrong # of arguments? */
  2595.       {
  2596.       printf(
  2597.  
  2598.       "GEM RESOURCE LINKER             Release %d   %02x.%02x.%02x\n"
  2599.       "Written by Harald Siegmund      Copyright (c) 1994\n"
  2600.       "\n"
  2601.       "usage: rlink target_file compiled_resource[...]\n"
  2602.  
  2603.       , RELEASE, _DAY, _MONTH, _YEAR & 0xff);
  2604.  
  2605.       return 1;
  2606.       }
  2607.  
  2608.    link_rsc(argv[1],argc - 2,argv + 2);   /* start linker */
  2609.  
  2610.    return 0;                              /* that's it */
  2611.  
  2612. }     /* main() */
  2613.  
  2614.  
  2615. /*EOF*/
  2616.    GEM RESOURCE COMPILER AND LINKER
  2617.    =============================================================================
  2618.    Written by Harald Siegmund                            Copyright (c) 1990-1994
  2619.  
  2620.    The resource compiler package is Public Domain. You may use it for free,
  2621.    give it away to other people or upload it on mailboxes. Please don't change
  2622.    or delete any file in the RCOM archive. Always copy the complete package.
  2623.    Thanx!
  2624.    -----------------------------------------------------------------------------
  2625.    Documentation history:
  2626.  
  2627.    1990:
  2628.       Apr 05: creation of file
  2629.       Jun 24: putting documentation into standard form
  2630.    1992:
  2631.       Jul 19: reorganizing documentation
  2632.       Nov 10: first public release
  2633.    1993:
  2634.       Aug 30: adding chapter 3
  2635.    1994:
  2636.       Feb 08: cosmetic changes
  2637.       Mar 10: adding chapter 5: the resource linker
  2638.  
  2639.    -----------------------------------------------------------------------------
  2640.    Program history:
  2641.  
  2642.    1990:
  2643.       Apr 05: introduced
  2644.       Jul 17: release 1.01 (bug fixed)
  2645.    1991:
  2646.       Jun 06: release 1.02 (ignoring high byte of object type)
  2647.    1992:
  2648.       Jun 14: cosmetic changes (standard copyright message)
  2649.       Nov 10: first public release
  2650.    1993:
  2651.       Aug 30: support long resource format
  2652.    1994:
  2653.       Feb 08: only cosmetic changes in the source (functionality still
  2654.               the same)
  2655.       Mar 10: Adding the resource linker.
  2656.               The compiler has been adjusted accordingly.
  2657.       Apr 19: Debugging resource linker (corrupted list of resource descriptors)
  2658.  
  2659.    -----------------------------------------------------------------------------
  2660.    Developer contact:
  2661.  
  2662.    adequate systems
  2663.    Gesellschaft für angemessene Systemlösungen mbH
  2664.    c/o Harald Siegmund
  2665.    Brauereistr. 2
  2666.    D-67549 Worms
  2667.    Germany
  2668.  
  2669.    e-mail : Harald_Siegmund@kl.maus.de
  2670.    MausNet: Harald Siegmund@KL
  2671.  
  2672.    =============================================================================
  2673.    Table of contents
  2674.  
  2675.    1. What is a resource compiler?
  2676.    2. Files on the disk
  2677.    3. Using compiled resources in your own programs
  2678.    4. Notes for users of the Interface resource editor
  2679.    5. The resource linker
  2680.  
  2681.  
  2682.    =============================================================================
  2683.    1. What is a resource compiler?
  2684.  
  2685.    RCOM is a utility which converts GEM resource files to linkable object files
  2686.    (DRI format), which can be included into your programs. The locations of the
  2687.    pointers in the resource will be written to the relocation table of the
  2688.    object file, so the resource will automatically be relocated after is has
  2689.    been loaded into memory. RCOM is called the following way:
  2690.  
  2691.    rcom resource_file object_file
  2692.  
  2693.    For example, the following call will compile the resource 'demo.rsc' to
  2694.    the object file 'demo.o':
  2695.  
  2696.    rcom demo.rsc demo.o
  2697.  
  2698.  
  2699.    -----------------------------------------------------------------------------
  2700.    2. Files on the disk
  2701.  
  2702.    The RCOM disk/folder/archive/whatever should contain the following files:
  2703.  
  2704.    RSRC.DOC          the file you are just reading
  2705.  
  2706.    BIN\RCOM.TTP      resource compiler
  2707.    BIN\RLINK.TTP     resource linker
  2708.  
  2709.    LIB\RSRC.C        source of resource handler
  2710.    LIB\RSRC.H        header file with some definitions
  2711.    LIB\RSRC.O        resource handler as object file
  2712.  
  2713.    SOURCE\RCOM.C     source of the resource compiler
  2714.    SOURCE\RLINK.C    source of the resource linker
  2715.  
  2716.    DEMO\DEMO.C       the source of a small demonstration program
  2717.    DEMO\DEMORSC.DFN  definition file (DRI RCS 2.1) of its resource
  2718.    DEMO\DEMORSC.H    C header file of its resource
  2719.    DEMO\DEMORSC.RSC  the demo resource in the standard RSC format
  2720.  
  2721.  
  2722.    -----------------------------------------------------------------------------
  2723.    3. Using compiled resources in your own programs
  2724.  
  2725.    Link the compiled resource and the file RSRC.O (which can be found in the
  2726.    LIB folder) to your application. That's all! The module RSRC.O replaces the
  2727.    AES resource-library functions. The C source of RSRC.O can be found in
  2728.    LIB\RSRC.C. RSRC.O was created using the Pure C development package.
  2729.  
  2730.  
  2731.    -----------------------------------------------------------------------------
  2732.    4. Notes for users of the Interface resource editor
  2733.  
  2734.    The resource compiler accepts the long resource format created by Interface
  2735.    (resources > 64K). However the object indices passed to the functions in
  2736.    RSRC.C are still of type 'int' (which is 16 bit in Pure C). You'll have to
  2737.    modify RSRC.C if you want to deal around with very large resources (with
  2738.    more than 32767 structures of one type, e.g. more that 32767 TEDINFOs).
  2739.  
  2740.  
  2741.    -----------------------------------------------------------------------------
  2742.    5. The resource linker
  2743.  
  2744.    A compiler for resource files seems strange enough, but a resource file
  2745.    linker?! Well, let's have a closer look at this tool.
  2746.  
  2747.    The command line for the linker looks like this:
  2748.  
  2749.    rlink target_file compiled_resource[...]
  2750.  
  2751.    The first argument is the file specification of the object file to create,
  2752.    followed by one or several filespecs of compiled resources. The linker
  2753.    merges all compiled resources and writes them to one file. This mechanism
  2754.    allows _several_ resource files to be included in one program:
  2755.  
  2756.    1. compile all RSC files with the resource compiler
  2757.    2. merge the object files created by the compiler with the resource linker
  2758.    3. link the resulting object file and the resource manager (RSRC.O) to
  2759.       your program
  2760.  
  2761.  
  2762.    How to work with several resources
  2763.  
  2764.    The resource manager (RSRC.C) has a built-in function which allows to
  2765.    declare one of the included RSC files to be the active one. All rsrc_...
  2766.    functions (rsrc_gaddr for example) work with the active resource. This
  2767.    'bank-switching'-like mechanism has the advantage that the header files
  2768.    created by the resource construction set can be used without being
  2769.    adjusted or converted in any way.
  2770.  
  2771.    The selection function is named rsrc_select() and gets a pointer to the
  2772.    filename of the resource to select (without path and extension, in
  2773.    capital letters). The first resource passed to the resource linker is
  2774.    the active one by default.
  2775.  
  2776.  
  2777.    Example:
  2778.  
  2779.    1. Compiling and linking
  2780.  
  2781.       rcom menu.rsc menu.o
  2782.       rcom dialog.rsc dialog.o
  2783.       rcom strings.rsc strings.o
  2784.       rlink merged.o menu.o dialog.o strings.o
  2785.  
  2786.       Add merged.o and rsrc.o to your project.
  2787.  
  2788.    2. In your source
  2789.  
  2790.       #include "rsrc.h"    /* resource manager definitions */
  2791.       #include "menu.h"    /* resource definitions for MENU.RSC */
  2792.       #include "dialog.h"  /* resource definitions for DIALOG.RSC */
  2793.       #include "strings.h" /* resource definitions for STRINGS.RSC */
  2794.  
  2795.          /* "MENU" is the active resource by default */
  2796.  
  2797.       rsrc_gaddr(R_TREE,MENU_BAR,&mbar);  /* get tree MENU_BAR from "MENU" */
  2798.  
  2799.       rsrc_select("STRINGS");             /* switch to "STRINGS" resource */
  2800.       rsrc_gaddr(R_STRING,STR_HDLINE,&h); /* get string STR_HDLINE */
  2801.       rsrc_gaddr(R_STRING,STR_ERRMSG,&msg);  /* get string STR_ERRMSG */
  2802.  
  2803.       rsrc_select("DIALOG");              /* switch to "DIALOG" resource */
  2804.       rsrc_gaddr(R_TREE,DIAL_PARAMS,&p);  /* get tree DIAL_PARAMS */
  2805.  
  2806.  
  2807.    =============================================================================
  2808.    End Of File
  2809. ⇧⇧❎⇧⇧FILTERBAR╱(Φ⇧t⇧t⇧t⇧t⇧ן⇧ן$✓⇧❎⇧ן(¯¯⇧◆④⓪⇩①⇦$◆⇩¯¯¯¯⑤Φ⇩♪⇧⇧⇨¯¯¯¯⑤⇧⇦⇧⇩⇨⇨⇦⇧⇧⇦¯¯¯¯⑤⇧ ❎⇨⇨⇨⇧❎¯¯¯¯⑤⇧<⇦⇦⇦⇨⇧◆╱╱⇧④¯①⇧⇩⇩⇨⇦ ⇧❎¯¯¯¯④①A╱②⇧¯¯¯¯(⇧X╱◆✓❎⑤⇧⇧t⇧â⇧ä⇨╱⇩①ǯ¯⇧⇧à⇧ê⇧ë❎①Ç⇨⇧⇧è⇧Å⇧É❎①Ç❎⇧⇧æ⇧À⇧Ã❎╱①Ç%⇧⇧Õ⇧¨⇧ש❎╱⇩①ǯ¯⇧RAHMEN FILTERN0%100%····································Abbruch mit Ctrl.+Shift+Alt./*TAB=3***CHAR={ATARI}**********************************************************
  2810. *
  2811. *  Project name : FILTER
  2812. *  Module name  : Main part
  2813. *  Symbol prefix: f_
  2814. *
  2815. *  Author       : Harald Siegmund (HS)
  2816. *  Co-Authors   : -
  2817. *  Write access : HS
  2818. *
  2819. *  Notes        : -
  2820. *-------------------------------------------------------------------------------
  2821. *  Things to do :
  2822. *
  2823. *  - unfinished
  2824. *-------------------------------------------------------------------------------
  2825. *  History:
  2826. *
  2827. *  1996:
  2828. *
  2829. *******************************************************************************/
  2830. /*KEY _NAME="main part of filter" */
  2831. /*END*/
  2832.  
  2833. /*******************************************************************************
  2834. *                                                                              *
  2835. *                                   INCLUDES                                   *
  2836. *                                                                              *
  2837. *******************************************************************************/
  2838.  
  2839. #include <string.h>
  2840.  
  2841. #include "filter.h"
  2842. #include "flib.h"
  2843.  
  2844. /*KEY _END */
  2845.  
  2846.  
  2847. /*******************************************************************************
  2848. *                                                                              *
  2849. *                               EXTERN REFERENCES                              *
  2850. *                                                                              *
  2851. *******************************************************************************/
  2852.  
  2853. /*******************************************************************************
  2854. *                                                                              *
  2855. *                            UNINITIALIZED GLOBALS                             *
  2856. *                                                                              *
  2857. *******************************************************************************/
  2858.  
  2859. /*******************************************************************************
  2860. *                                                                              *
  2861. *                             INITIALIZED GLOBALS                              *
  2862. *                                                                              *
  2863. *******************************************************************************/
  2864.  
  2865. /*******************************************************************************
  2866. *                                                                              *
  2867. *                                    MACROS                                    *
  2868. *                                                                              *
  2869. *******************************************************************************/
  2870.  
  2871. /*******************************************************************************
  2872. *                                                                              *
  2873. *                               TYPE DEFINITIONS                               *
  2874. *                                                                              *
  2875. *******************************************************************************/
  2876.  
  2877. /*******************************************************************************
  2878. *                                                                              *
  2879. *                                LOCAL PROTOTYPES                              *
  2880. *                                                                              *
  2881. *******************************************************************************/
  2882.  
  2883. /*******************************************************************************
  2884. *                                                                              *
  2885. *                             UNINITIALIZED STATICS                            *
  2886. *                                                                              *
  2887. *******************************************************************************/
  2888.  
  2889. /*******************************************************************************
  2890. *                                                                              *
  2891. *                              INITIALIZED STATICS                             *
  2892. *                                                                              *
  2893. *******************************************************************************/
  2894.  
  2895. /*******************************************************************************
  2896. *                                                                              *
  2897. *                                 LOCAL FUNCTIONS                              *
  2898. *                                                                              *
  2899. *******************************************************************************/
  2900.  
  2901. /*******************************************************************************
  2902. *                                                                              *
  2903. *                                GLOBAL FUNCTIONS                              *
  2904. *                                                                              *
  2905. *******************************************************************************/
  2906.  
  2907. VOID main(VOID) { /* Dummy-Funktion, wird zum Debuggen gebraucht */ }
  2908.  
  2909. /*START*/
  2910. /*******************************************************************************
  2911. *
  2912. *  f_init: Filter initialisieren
  2913. *
  2914. *  Diese Funktion wird einmalig unmittelbar nach dem Laden des Filters
  2915. *  aufgerufen. Liefert sie einen Fehler zurück, so wird der Filter sofort
  2916. *  ohne weitere Aufrufe wieder aus dem Speicher entfernt. f_init() erhält
  2917. *  als Argument einen Zeiger auf den Filter Environment Descriptor. In diesem
  2918. *  sind folgende Informationen zu finden:
  2919. *
  2920. *  ID       module;        ID des Aufrufers; muß nicht beachtet werden
  2921. *  VERSION  version;       Versionsnummer des Aufrufers.
  2922. *  SBYTE    *ppath;        Zeiger auf den Pfadnamen, aus dem das Filter
  2923. *                          geladen wurde.
  2924. *  SBYTE    *pfspec;       Zeiger auf Pfad- und Dateiname des Filters
  2925. *                          ACHTUNG: Beide Zeiger sind nur bis zum Ende von
  2926. *                          f_init() gültig! Bei Bedarf sollten die Strings
  2927. *                          in einen eigenen Puffer kopiert werden.
  2928. *  XPOINT   pfnc;          Zeiger auf die Calamus-Funktionstabelle.
  2929. *  ULONG    retflags;      Return-Flags, vorbelegt mit 0. Hier können von
  2930. *                          f_init() die Flags F_INIT_... abgelegt werden.
  2931. *
  2932. *  Out:
  2933. *     Status:
  2934. *     OK
  2935. *     EMM_.../DSM_...      Fehler
  2936. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  2937. *     ...                  weitere standard Calamus Fehlercodes
  2938. *
  2939. *     wenn Status >= 0:
  2940. *     F_INI_...-Flags in <envd->retflags>
  2941. *
  2942. *******************************************************************************/
  2943.  
  2944. SCODE f_init(
  2945.  
  2946. VERSION     cvnum,                  /* Calamus-Versionsnummer */
  2947. F_ENVD      *envd)                  /* ^Filter Environment Descriptor */
  2948. {
  2949. /*END*/
  2950.  
  2951.    return flib_init(cvnum,envd);          /* Library initialisieren */
  2952.  
  2953. }     /* f_init() */
  2954.  
  2955.  
  2956. /*START*/
  2957. /*******************************************************************************
  2958. *
  2959. *  f_exit: Filter beenden
  2960. *
  2961. *  f_exit() ist das Gegenstück zu f_init(). Es wird einmal aufgerufen, bevor
  2962. *  der Filter aus dem Speicher entfernt wird (Ausnahme: f_init() ist bereits
  2963. *  fehlgeschlagen).
  2964. *
  2965. *  Out:
  2966. *     OK
  2967. *     EMM_.../DSM_...      Fehler
  2968. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  2969. *     ...                  weitere standard Calamus Fehlercodes
  2970. *
  2971. *     Der Status wird vom Aufrufer noch angezeigt, hat aber keinen Einfluß auf
  2972. *     die Terminierung des Filters.
  2973. *
  2974. *******************************************************************************/
  2975.  
  2976. SCODE f_exit(VOID)
  2977. {
  2978. /*END*/
  2979.  
  2980.    return flib_exit();                    /* Library abmelden */
  2981.  
  2982. }     /* f_exit() */
  2983.  
  2984.  
  2985. /*START*/
  2986. /*******************************************************************************
  2987. *
  2988. *  f_reloc: Filter relozieren
  2989. *
  2990. *  Filter können wie Module auch beim Packen des Speichers im logischen
  2991. *  Adressraum verschoben werden. Sämtliche in der Relozierungstabelle
  2992. *  aufgeführten Adressen werden dabei von Calamus automatisch aktualisiert.
  2993. *  Es kann jedoch sein, daß der Filter zur Laufzeit Zeiger berechnet hat, die
  2994. *  in seinen eigenen Code zeigen und nicht in der Relozierungstabelle stehen.
  2995. *  Es handelt sich üblichwerweise um solche Zeiger, die mit NULL oder gar nicht
  2996. *  statisch initialisiert sind. Diese müssen von f_reloc() aktualisiert werden.
  2997. *  f_reloc() wird aufgerufen, nachdem Calamus den Filter verschoben hat.
  2998. *
  2999. *  Out:
  3000. *     Status:
  3001. *     OK
  3002. *     EMM_.../DSM_...      Fehler
  3003. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3004. *     ...                  weitere standard Calamus Fehlercodes
  3005. *
  3006. *******************************************************************************/
  3007.  
  3008. SCODE f_reloc(VOID)
  3009. {
  3010. /*END*/
  3011.  
  3012.    return OK;
  3013.  
  3014. }     /* f_reloc() */
  3015.  
  3016.  
  3017. /*START*/
  3018. /*******************************************************************************
  3019. *
  3020. *  f_getname: Name des Filters ermitteln
  3021. *
  3022. *  Der Filter muß seinen Namen in den vorgeschriebenen Puffer kopieren.
  3023. *
  3024. *  Hinweis: Leider bietet die Calamus-Oberfläche nicht viel Platz für lange
  3025. *  Namen, auch wenn der Puffer für ausführliche Namen in der Regel reichen
  3026. *  würde. Also bitte möglichst kurz fassen!
  3027. *
  3028. *  Out:
  3029. *     Status:
  3030. *     OK
  3031. *     EMM_.../DSM_...      Fehler
  3032. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3033. *     ...                  weitere standard Calamus Fehlercodes
  3034. *
  3035. *     wenn Status >= 0:
  3036. *     Name des Filter in <name>
  3037. *
  3038. *******************************************************************************/
  3039.  
  3040. SCODE f_getname(
  3041.  
  3042. UBYTE       name[MAX_NMSIZE])       /* out: Name des Filters */
  3043. {
  3044. /*END*/
  3045.  
  3046.  
  3047. }     /* f_getname() */
  3048.  
  3049.  
  3050. /*START*/
  3051. /*******************************************************************************
  3052. *
  3053. *  f_geticon: Filter-Icon ermitteln
  3054. *
  3055. *  Der Filter muß sein Icon in den vorgeschriebenen Puffer kopieren.
  3056. *  Die Icon-Größe ist auf 32 x 32 Pixel festgelegt. Es kann entweder ein
  3057. *  monochromes oder ein True Color Icon zurückgeliefert werden. Das Filter-
  3058. *  Modul kommt auf jeden Fall mit beidem klar. Mit Hilfe der Funktion
  3059. *  icon_type() [FLIB.H] ist es möglich, den aktuellen Bildschirmtyp zu
  3060. *  ermitteln und - falls beide Icons vorhanden sind - das jeweils passende
  3061. *  zurückzuliefern.
  3062. *
  3063. *  Hinweis: Sowohl bei monochromen als auch True Color Icons wird 0 als
  3064. *           schwarz und 1 bzw. $ffffff als weiß interpretiert.
  3065. *
  3066. *  Out:
  3067. *     Status:
  3068. *     OK
  3069. *     EMM_.../DSM_...      Fehler
  3070. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3071. *     ...                  weitere standard Calamus Fehlercodes
  3072. *
  3073. *     wenn Status >= 0:
  3074. *     Filter-Icon in <ides>
  3075. *
  3076. *******************************************************************************/
  3077.  
  3078. SCODE f_geticon(
  3079.  
  3080. F_ICON      *ides)                  /* out: Icon-Descriptor */
  3081. {
  3082. /*END*/
  3083.  
  3084.  
  3085. }     /* f_geticon() */
  3086.  
  3087.  
  3088. /*START*/
  3089. /*******************************************************************************
  3090. *
  3091. *  f_infodial: Info- und Copyright-Dialog anzeigen
  3092. *
  3093. *  Diese Funktion dient lediglich zum Darstellen einen Formulars mit
  3094. *  Hinweisen auf den Autor, Beschreibung des Filters etc.
  3095. *
  3096. *  Out:
  3097. *     Status:
  3098. *     OK
  3099. *     EMM_.../DSM_...      Fehler
  3100. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3101. *     ...                  weitere standard Calamus Fehlercodes
  3102. *
  3103. *     Der Status wird vom Aufrufer angezeigt, hat aber ansonsten keine
  3104. *     weiteren Auswirkungen.
  3105. *
  3106. *******************************************************************************/
  3107.  
  3108. SCODE f_infodial(VOID)
  3109. {
  3110. /*END*/
  3111.  
  3112.  
  3113. }     /* f_infodial() */
  3114.  
  3115.  
  3116. /*START*/
  3117. /*******************************************************************************
  3118. *
  3119. *  f_defpar: Default-Parameter des Filters zurückliefern
  3120. *
  3121. *  Diese Funktion muß ein Speichersegment erzeugen, in dem sich die
  3122. *  Standardwerte sämtlicher Filterparameter befinden. Der Aufrufer kann
  3123. *  dieses Segment dann zum Beispiel als Grundlage für eine Parameterliste
  3124. *  verwenden, indem er das Segment kopiert und die Kopien mit der Funktion
  3125. *  f_paredit() bearbeiten läßt.
  3126. *
  3127. *  Die eigentliche Erzeugung des Speichersegments übernimmt die Funktion
  3128. *  par_create() in der Filter Library.
  3129. *
  3130. *  Out:
  3131. *     Status:
  3132. *     OK
  3133. *     EMM_.../DSM_...      Fehler
  3134. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3135. *     ...                  weitere standard Calamus Fehlercodes
  3136. *
  3137. *     wenn Status >= 0:
  3138. *     Handle des Speichersegments mit den Default-Parametern in <hparams>
  3139. *
  3140. *******************************************************************************/
  3141.  
  3142. SCODE f_defpar(
  3143.  
  3144. MHANDLE     *hparams)               /* out: Handle der Default-Parameter */
  3145. {
  3146. /*END*/
  3147.  
  3148.  
  3149. }     /* f_defpar() */
  3150.  
  3151.  
  3152. /*START*/
  3153. /*******************************************************************************
  3154. *
  3155. *  f_paredit: Filterparameter editieren
  3156. *
  3157. *  Der Filter muß mit dieser Funktion einen Editor für Filterparameter
  3158. *  zur Verfügung stellen. Damit f_paredit() überhaupt aufgerufen wird,
  3159. *  ist es erforderlich, daß von f_init() das F_INI_ADDPAR Bit im Eintrag
  3160. *  <flags> des Environment Descriptors gesetzt wird.
  3161. *
  3162. *  Implementiert wird der Parameter-Editor üblichweise als Formular mit
  3163. *  den entsprechenden Einstellmöglichkeiten.
  3164. *
  3165. *  Out:
  3166. *     Status:
  3167. *     OK
  3168. *     EMM_.../DSM_...      Fehler
  3169. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3170. *                          oder: Benutzer hat die Operation abgebrochen
  3171. *     ...                  weitere standard Calamus Fehlercodes
  3172. *
  3173. *     wenn Status >= 0:
  3174. *     aktualisierte Parameter im Speichersegment <hparams> (im Fehlerfall
  3175. *      darf <hparams> nicht verändert werden!)
  3176. *
  3177. *******************************************************************************/
  3178.  
  3179. SCODE f_paredit(
  3180.  
  3181. MHANDLE     hparams)                /* Handle der Filterparameter */
  3182. {
  3183. /*END*/
  3184.  
  3185.  
  3186. }     /* f_paredit() */
  3187.  
  3188.  
  3189. /*START*/
  3190. /*******************************************************************************
  3191. *
  3192. *  f_setpic: Bildparameter festlegen
  3193. *
  3194. *  Diese Funktion wird unter anderem vor Beginn des eigentlichen Filter-
  3195. *  Vorgangs aufgerufen. Der übergebene Bild-Descriptor enthält Informationen
  3196. *  über die Bilddaten:
  3197. *
  3198. *  MHANDLE hpar;        Handle der zu benutzenden Filterparameter
  3199. *  SWORD ptype;         Bildtyp:
  3200. *                       PITYPE_GREY:
  3201. *                          Graubild, 1 Byte pro Pixel, 0=dunkel...0xff=hell
  3202. *                       PITYPE_0RGB:
  3203. *                          True Color RGB, 1 Langwort pro Pixel
  3204. *                          Bits 0...7  : blau (0=dunkel...0xff=hell)
  3205. *                          Bits 8...15 : grün (0=dunkel...0xff=hell)
  3206. *                          Bits 16...23: rot (0=dunkel...0xff=hell)
  3207. *                          Bits 24...32: reserviert
  3208. *                       PITYPE_KCYM:
  3209. *                          True Color KCYM, 1 Langwort pro Pixel
  3210. *                          Bits 0...7  : magenta (0=dunkel...0xff=hell)
  3211. *                          Bits 8...15 : gelb (0=dunkel...0xff=hell)
  3212. *                          Bits 16...23: cyan (0=dunkel...0xff=hell)
  3213. *                          Bits 24...32: schwarz (0=dunkel...0xff=hell)
  3214. *  ULONG width;         Gesamtbreite des Bildes in Pixel
  3215. *  ULONG height;        Gesamthöhe des Bildes in Pixel
  3216. *  ULONG basew;         Breite des Bildrahmens im Basismaß
  3217. *  ULONG baseh;         Höhe des Bildrahmens im Basismaß
  3218. *  CLR oclr;            Position und Größe des Rahmens im Basismaß
  3219. *                       (<oclr.w> und <basew> sowie <oclr.h> und <baseh>
  3220. *                        sind identisch)
  3221. *  ULONG fflags;        Flags:
  3222. *                       F_FIL_PREVIEW     Filter wurde für Preview aufgerufen
  3223. *
  3224. *  Ein Filter kann Bildtyp sowie Ausmaße des Rahmens beeinflussen. Zu diesem
  3225. *  Zweck existieren weitere Einträge im Bild-Descriptor, die vom Aufrufer
  3226. *  mit den Ist-Werten vorbelegt sind:
  3227. *
  3228. *  SWORD nptype;        neuer Bildtyp (PITYPE_...)
  3229. *  ULONG nwidth;        neue Breite in Pixel
  3230. *  ULONG nheight;       neue Höhe in Pixel
  3231. *  CLR nclr;            neue Position und Größe des Rahmens im Basismaß
  3232. *
  3233. *  Die der Funktion f_do() übergebene Destination Pixel Map hat bereits
  3234. *  das durch die <n...> Einträge beschriebene Format.
  3235. *
  3236. *  Hinweis: Zur Auswertung der Werte im "Basismaß" kann die Library-Funktion
  3237. *           measure_d() herangezogen werden.
  3238. *
  3239. *  Out:
  3240. *     Status:
  3241. *     OK
  3242. *     EMM_.../DSM_...      Fehler
  3243. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3244. *     ...                  weitere standard Calamus Fehlercodes
  3245. *
  3246. *     wenn Status >= 0:
  3247. *     aktualisierte Rahmenparameter in pdes->nptype,nwidth,nheight,nclr
  3248. *
  3249. *******************************************************************************/
  3250.  
  3251. SCODE f_setpic(
  3252.  
  3253. F_PICD      *pdes)                  /* ^Bild-Descriptor */
  3254. {
  3255. /*END*/
  3256.  
  3257.  
  3258. }     /* f_setpic() */
  3259.  
  3260.  
  3261. /*START*/
  3262. /*******************************************************************************
  3263. *
  3264. *  f_start: Filtern beginnen
  3265. *
  3266. *  Diese Funktion wird einmalig zu Beginn des Filter-Vorgangs aufgerufen.
  3267. *  Vorher erfolgt auf jeden Fall ein Aufruf von f_setpic().
  3268. *
  3269. *  Out:
  3270. *     Status:
  3271. *     OK
  3272. *     EMM_.../DSM_...      Fehler
  3273. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3274. *     ...                  weitere standard Calamus Fehlercodes
  3275. *
  3276. *******************************************************************************/
  3277.  
  3278. SCODE f_start(VOID)
  3279. {
  3280. /*END*/
  3281.  
  3282.    return OK;
  3283.  
  3284. }     /* f_start() */
  3285.  
  3286.  
  3287. /*START*/
  3288. /*******************************************************************************
  3289. *
  3290. *  f_do: Filtern
  3291. *
  3292. *  Die eigentliche Bearbeitung der Bilddaten erfolgt in der Funktion f_do().
  3293. *  Sie wird mindestens einmal zwischen f_start() und f_end() aufgerufen.
  3294. *  Bei knappem Speicher werden jeweils nur Teile der Originaldaten bearbeitet
  3295. *  und f_do() auf jedes dieser Teile angewendet. Falls der im Filter
  3296. *  eingesetzte Algorithmus die Abarbeitung in Teilstücken nicht erlaubt,
  3297. *  kann dies durch Setzen des F_INI_NSTRIP Flags durch die f_init() Funktion
  3298. *  verhindert werden.
  3299. *
  3300. *  Der Parameterblock enthält die beiden Pixel Map Descriptoren <src> und
  3301. *  <dst>, die jeweils folgende Elemente enthalten:
  3302. *
  3303. *  MHANDLE hmap;        Handle des Speichersegments, das die Bilddaten enthält
  3304. *  ULONG   baseoff;     Offset in das Segment zum Beginn der ersten Scanline
  3305. *  UWORD   nplanes;     Anzahl der Planes (1 bei Graubildern, 3 bei RGB- und
  3306. *                       4 bei CYMK-Bildern)
  3307. *  ULONG   mapoff;      Offset vom Beginn der ersten Scanline zum Beginn der
  3308. *                       linken oberen Ecke des durch <area> beschriebenen
  3309. *                       Bereichs
  3310. *  SLONG   xoff;        Breite einer Scanline in Bytes
  3311. *  SLONG   yoff;        Offset zum nächsten Pixel in horz. Richtung (1 bei
  3312. *                       Graubildern, 4 bei RGB- oder CYMK-Bildern)
  3313. *  CLR     area;        Position und Größe des zu bearbeitenden Bereichs in
  3314. *                       Pixel
  3315. *
  3316. *  Die Vorgehensweise zum Bearbeiten der Daten sieht dann ungefähr so aus:
  3317. *
  3318. *  - beide Datensegmente (<src.hmap> und <dst.hmap> werden mit mem_open()
  3319. *    geöffnet
  3320. *  - auf die zurückgelieferten Basisadressen addiert man den jeweiligen
  3321. *    <baseoff> sowie <mapoff>; die so berechneten Zeiger weisen auf die ersten
  3322. *    zu lesenden bzw. schreibenden Pixel
  3323. *  - in <area.h> steht, wieviele Scanlines, in <area.w> wieviele Pixel in
  3324. *    jeder Scanline bearbeitet werden müssen. <yoff> gibt die Breite der
  3325. *    gesamten Scanline (nicht nur von <area>!) an
  3326. *  - die Datensegmente werden mit mem_close() wieder zugemacht
  3327. *
  3328. *  Die Quelldaten liegen immer als SEPARATE Byteplanes hintereinander vor, die
  3329. *  Zieldaten müssen INTERLEAVED geschrieben werden (alle Planes eines Pixels
  3330. *  hintereinander). Der <xoff> Wert der Source Map hat also immer den Wert 1,
  3331. *  in <xoff> der Destination Map steht bei Graubildern der Wert 1, bei RGB-
  3332. *  und True Color Bildern der Wert 4 (1 Langwort pro Pixel).
  3333. *
  3334. *  Out:
  3335. *     Status:
  3336. *     OK
  3337. *     EMM_.../DSM_...      Fehler
  3338. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3339. *     ...                  weitere standard Calamus Fehlercodes
  3340. *
  3341. *******************************************************************************/
  3342.  
  3343. SCODE f_do(
  3344.  
  3345. F_FILTER    *dp)                    /* ^Parameterblock */
  3346. {
  3347. /*END*/
  3348.  
  3349.  
  3350. }     /* f_do() */
  3351.  
  3352.  
  3353. /*START*/
  3354. /*******************************************************************************
  3355. *
  3356. *  f_end: Filtern beenden
  3357. *
  3358. *  Nach Beendigung des letzten f_do() wird einmal diese Funktion aufgerufen.
  3359. *  Sie zeigt an, daß sämtliche Bilddaten bearbeitet worden sind, und kann
  3360. *  für Aufräumzwecke (z.B. löschen temporäre Puffer) benutzt werden.
  3361. *
  3362. *  Out:
  3363. *     Status:
  3364. *     OK
  3365. *     EMM_.../DSM_...      Fehler
  3366. *     STATUS_ABORTED       Fehler, Meldung wurde bereits angezeigt
  3367. *     ...                  weitere standard Calamus Fehlercodes
  3368. *
  3369. *     Der Status wird vom Aufrufer angezeigt, hat aber ansonsten keine
  3370. *     weiteren Auswirkungen.
  3371. *
  3372. *******************************************************************************/
  3373.  
  3374. SCODE f_end(VOID)
  3375. {
  3376. /*END*/
  3377.  
  3378.    return OK;
  3379.  
  3380. }     /* f_end() */
  3381.  
  3382.  
  3383. /*EOF*/
  3384.   Filter Development Kit für das Filter-Modul von adequate systems
  3385.   ------------------------------------------------------------------------------
  3386.  
  3387.   Eine Beschreibung des FDKs finden Sie in der Datei DOC\FDK.TXT. Bitte
  3388.   beachten Sie auch die Verbreitungshinweise in der Datei DOC\KONTAKT.TXT.
  3389.  
  3390.   ------------------------------------------------------------------------------
  3391.  
  3392.   INHALT:
  3393.  
  3394.   LIESMICH.TXT          Dieser Text
  3395.  
  3396.   DEBUG\                Debugging-Werkzeuge:
  3397.     DEBUGFIL.S             Source des Debugging-Filters
  3398.     DEBUGFIL.FIL           Debugging-Filter
  3399.  
  3400.   H\                    C Headerdateien mit Definitionen:
  3401.     CALDEF.H               Calamus
  3402.     FILTER.H               Filter-Schnittstelle
  3403.     FLIB.H                 Filter Library
  3404.  
  3405.   LIB\                  Libraries:
  3406.     FSTART.S               Source des Startup Files
  3407.     FSTART.O               Startup File
  3408.     FSTART_D.O             Startup File für Debugging-Versionen
  3409.     FILTER93.LIB           Library zur Anbindung an 1993er Calamus
  3410.     FILTER94.LIB           Library zur Anbindung an Calamus-Versionen ab 1994
  3411.  
  3412.   SOURCE\               Quellen:
  3413.     RAW.C                  Raw-Datei für neue Filter
  3414.     BAR.RSC                Resource mit Anzeigebalken; kann in eigene Filter
  3415.     BAR.HRD                 eingebaut werden
  3416.  
  3417.   DOC\                  Dokumentation:
  3418.     FDK.TXT                Beschreibung des Filter Development Kits
  3419.     FLIB.TXT               Dokumentation der Filter-Library
  3420.     KONTAKT.TXT            Entwickler-Kontaktadressen und Verbreitungshinweise
  3421.     VERSION.TXT            Liste aller bisher erschienenen Versionen des FDK
  3422.  
  3423.   BEISPIEL\             Beispiel-Filter
  3424.                         (in BEISPIEL.TXT ist der Inhalt des Ordners beschrieben)
  3425.  
  3426.   RCOM\                 Resource Compiler
  3427.                         (in RSRC.DOC ist der Inhalt des Ordners beschrieben)
  3428.  
  3429.  
  3430.   Calamus® ist ein eingetragenes Warenzeichen der Firma MGI.
  3431.  
  3432.  
  3433.   +++ Dateiende +++
  3434. @⇧.          ⓪(}t$¡❎..         ⓪(}t$ó❎BAR     HRD(}t$w╱BAR     RSC(}t$x╱ן⇧RAW     C  (}t$y╱וT¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯⇧¯¯¯¯¯¯≡¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯◆ו¯¯¯¯¯¯τה¯¯¯c¯¯¯¯¯¯⇧¯¯¯¯¯¯ÿ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱f¯¯¯¯¯¯╱f¯¯¯f¯¯¯¯¯¯≡⇧¯¯¯¯¯¯ÿ`¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱f¯¯¯¯¯¯╱f¯¯¯f¯¯¯¯¯¯ÿ⇧¯¯¯¯¯¯ÿ`¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱f¯¯¯¯¯¯╱f¯¯¯f¯¯¯¯¯¯ÿ⇧¯¯¯¯¯¯ÿ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱g¯¯¯¯¯¯וה¯¯¯f¯¯¯¯¯¯ÿ⇧¯¯¯¯¯¯≡¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱f¯¯¯¯¯¯╱f¯¯¯f¯¯¯¯¯¯ÿ⇧¯¯¯¯¯¯Ç¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱f¯¯¯¯¯¯╱f¯¯¯f¯¯¯¯¯¯ÿ⇧¯¯¯¯¯¯Ç`¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯╱f¯¯¯¯¯¯╱f¯¯¯f¯¯¯¯¯¯ÿ⇧¯¯¯¯¯¯Ç`¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯◆ו¯¯¯¯¯¯τב¯¯¯ב¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯⇧⇧⇧⇧¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯²¯²¯²⇨¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯²¯²¯²⇨¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯²¯²¯²⇨¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯²¯²¯²⇨¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯²¯²¯²⇨¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯²¯²¯²⇨¯¯¯¯¯¯¯¯⇧⇧⇧¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯x¯¯¯¯¯¯π¯¯¯¯¯¯ו¯¯¯¯¯¯q¯¯¯¯¯¯#②¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯A¯¯¯¯¯¯⇦¯¯¯¯⇧$¯¯¯¯¯¯ÆI¯¯¯¯¯¯$Ư¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯p¯¯¯¯¯¯ג¯¯¯¯¯¯⇧τ¯¯¯¯¯¯q¯¯¯¯¯¯$¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯@¯¯¯¯¯¯$ǯ¯¯¯¯¯⇧$¯¯¯¯¯¯ÆI¯¯¯¯¯¯$Ư¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯y¯¯¯¯¯¯ב ¯¯¯¯¯¯⇧'¯¯¯¯¯¯H¯¯¯¯¯¯ב②¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯1¯¯¯¯¯¯#󯯯¯¯¯1$¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯I¯¯¯¯¯¯$"¯¯¯¯¯¯I$¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯y¯¯¯¯¯¯#*¯¯¯¯¯¯yΣ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯I¯¯¯¯¯¯ ¬¯¯¯¯¯¯I$¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯H¯¯¯¯¯¯ו<¯¯¯¯¯¯I'¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪♪¯♪¯♪¯✓≈¯≈¯≈¯ ¯¯¯¯¯¯¯¯¯¯¯¯⇧ב¯¯¯¯¯¯p¯¯¯¯¯¯נ߯¯¯¯¯¯!Σ¯¯¯¯¯¯Ç⑧¯¯¯¯¯¯¯¯¯¯¯¯≡≡≡⓪